我在数据库中有以下表格:
Parent ---------------------------------------------------------- | ID | Data1 | Data2 | Data 3 | ----------------------------------------------------------
Child ---------------------------------------------------------- | ID | ParentID | Data1 | Data 2 | ----------------------------------------------------------
ID是两个表中的关键字段。 ParentID是指向具有级联删除的Parent表的外键。
表格通过JPA(EclipseLink)进行管理。
可以跟踪从多个线程并行执行的JPQL查询:
DELETE FROM Parent p WHERE p.id in (SELECT p.id from Child c where c.ParentID.id = p.id and c.Data1 = 'some value')
我从多个线程调用此语句时肯定会遇到阻塞的线程,但我无法在数据库中找到任何锁定。
以下stacktrace中的java线程阻塞:
java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Ljava/io/FileDescriptor;[BIII)I(Native Method) at java.net.SocketInputStream.read([BII)I(SocketInputStream.java:129) - additional info (remote: vsa689590.wdf.sap.corp/10.68.36.77:7200, local: localhost/127.0.0.1:56918) at com.sap.dbtech.rte.comm.BasicSocketComm.receiveData()Lcom/sap/dbtech/util/StructuredMem;(BasicSocketComm.java:750) at com.sap.dbtech.rte.comm.BasicSocketComm.receive()Lcom/sap/dbtech/util/StructuredMem;(BasicSocketComm.java:845) at com.sap.dbtech.rte.comm.JdbcCommunication.execute(Lcom/sap/dbtech/util/StructuredMem;I)Lcom/sap/dbtech/util/StructuredMem;(JdbcCommunication.java:41) at com.sap.dbtech.jdbc.ConnectionSapDB.execute(Lcom/sap/dbtech/jdbc/packet/RequestPacket;ZZLjava/lang/Object;I)Lcom/sap/dbtech/jdbc/packet/ReplyPacket;(ConnectionSapDB.java:650) at com.sap.dbtech.jdbc.ConnectionSapDB.execute(Lcom/sap/dbtech/jdbc/packet/RequestPacket;Ljava/lang/Object;I)Lcom/sap/dbtech/jdbc/packet/ReplyPacket;(ConnectionSapDB.java:562) at com.sap.dbtech.jdbc.CallableStatementSapDB.execute(I)Z(CallableStatementSapDB.java:454) at com.sap.dbtech.jdbc.CallableStatementSapDB.execute()Z(CallableStatementSapDB.java:319) at com.sap.dbtech.jdbc.CallableStatementSapDB.executeUpdate()I(CallableStatementSapDB.java:804) at com.sap.dbtech.jdbc.trace.PreparedStatement.executeUpdate()I(PreparedStatement.java:174) at sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;(Method.java:597) at com.sun.proxy.$Proxy11.executeUpdate()I(Unknown Source) at com.sap.core.persistence.jdbc.trace.TraceablePreparedStatement.executeUpdate()I(TraceablePreparedStatement.java:90) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate()I(DelegatingPreparedStatement.java:105) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate()I(DelegatingPreparedStatement.java:105) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate()I(DelegatingPreparedStatement.java:105) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(Ljava/sql/Statement;Lorg/eclipse/persistence/internal/databaseaccess/DatabaseCall;Lorg/eclipse/persistence/internal/sessions/AbstractSession;)Ljava/lang/Integer;(DatabaseAccessor.java:831) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(Lorg/eclipse/persistence/internal/databaseaccess/DatabaseCall;Ljava/sql/Statement;Lorg/eclipse/persistence/internal/sessions/AbstractSession;)Ljava/lang/Integer;(DatabaseAccessor.java:906) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(Lorg/eclipse/persistence/queries/Call;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;Lorg/eclipse/persistence/internal/sessions/AbstractSession;)Ljava/lang/Object;(DatabaseAccessor.java:592) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(Lorg/eclipse/persistence/queries/Call;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;Lorg/eclipse/persistence/internal/sessions/AbstractSession;)Ljava/lang/Object;(DatabaseAccessor.java:535) at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(Lorg/eclipse/persistence/queries/Call;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;Lorg/eclipse/persistence/queries/DatabaseQuery;)Ljava/lang/Object;(AbstractSession.java:1717) at org.eclipse.persistence.sessions.server.ClientSession.executeCall(Lorg/eclipse/persistence/queries/Call;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;Lorg/eclipse/persistence/queries/DatabaseQuery;)Ljava/lang/Object;(ClientSession.java:253) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(Lorg/eclipse/persistence/internal/databaseaccess/DatasourceCall;)Ljava/lang/Object;(DatasourceCallQueryMechanism.java:207) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteAllUsingTempTables()Ljava/lang/Integer;(DatasourceCallQueryMechanism.java:131) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteAll()Ljava/lang/Integer;(DatasourceCallQueryMechanism.java:88) at org.eclipse.persistence.queries.DeleteAllQuery.executeDatabaseQuery()Ljava/lang/Object;(DeleteAllQuery.java:201) at org.eclipse.persistence.queries.DatabaseQuery.execute(Lorg/eclipse/persistence/internal/sessions/AbstractSession;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;)Ljava/lang/Object;(DatabaseQuery.java:844) at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(Lorg/eclipse/persistence/internal/sessions/UnitOfWorkImpl;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;)Ljava/lang/Object;(DatabaseQuery.java:743) at org.eclipse.persistence.queries.ModifyAllQuery.executeInUnitOfWork(Lorg/eclipse/persistence/internal/sessions/UnitOfWorkImpl;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;)Ljava/lang/Object;(ModifyAllQuery.java:145) at org.eclipse.persistence.queries.DeleteAllQuery.executeInUnitOfWork(Lorg/eclipse/persistence/internal/sessions/UnitOfWorkImpl;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;)Ljava/lang/Object;(DeleteAllQuery.java:124) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(Lorg/eclipse/persistence/queries/DatabaseQuery;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;)Ljava/lang/Object;(UnitOfWorkImpl.java:2871) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(Lorg/eclipse/persistence/queries/DatabaseQuery;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;I)Ljava/lang/Object;(AbstractSession.java:1516) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(Lorg/eclipse/persistence/queries/DatabaseQuery;Lorg/eclipse/persistence/internal/sessions/AbstractRecord;)Ljava/lang/Object;(AbstractSession.java:1498) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(Lorg/eclipse/persistence/queries/DatabaseQuery;Ljava/util/List;)Ljava/lang/Object;(AbstractSession.java:1463) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeUpdate()I(EJBQueryImpl.java:540)