这样的JPQL语句是否会在并行执行时导致数据库死锁?

时间:2016-02-24 14:11:37

标签: java jpa jpql

我在数据库中有以下表格:

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)

0 个答案:

没有答案