【发布时间】:2018-05-08 08:52:45
【问题描述】:
知道有很多关于这个的问题。这是由于该行数据被其他线程更新,而其他线程无法获取锁。 但是,我想更详细地询问:
我有一些代码如下:
// catch all for hibernate super exception
public SystemErrorCode map(final org.hibernate.JDBCException dae) {
log.info( "dae : " + dae );
log.info( "dae error code : " + dae.getErrorCode( ) );
log.info( "dae sql : " + dae.getSQL( ) );
log.info( "dae sql exception : " + dae.getSQLException( ) );
log.info( "dae sql state : " + dae.getSQLState( ) );
log.info( "dae cause : " + dae.getCause( ) );
log.info( "dae message : " + dae.getMessage( ) );
return new SystemErrorCode( "DAO0005", SYSTEM_DAO );
}
这是日志:
dae : org.hibernate.exception.LockAcquisitionException: could not execute native bulk manipulation query
dae error code : -911
dae sql : update PHistory SET currentStatus = :currentStatus , MODIFIEDDATETIME = CURRENT TIMESTAMP where pHistoryId = :pHistoryId
dae sql exception : com.ibm.db2.jcc.am.SqlTransactionRollbackException: DB2 SQL Error: SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68, DRIVER=3.65.110
dae sql state : 40001
dae cause : com.ibm.db2.jcc.am.SqlTransactionRollbackException: DB2 SQL Error: SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68, DRIVER=3.65.110
dae message : could not execute native bulk manipulation query
当我检查代码时,实际上没有其他线程来更新相同的记录,因为 pHistory 是主要的并且它是唯一的。
但是,我一直在生产中遇到这个问题,我无法在本地或 SIT 或 UAT 中模拟它。我想知道是哪个线程,或者我的代码从哪里锁定了同一行,然后导致了这个错误。
【问题讨论】:
-
您需要让您的 Db2 DBA 参与进来(如果有的话)。 “其他线程”可能不是您的应用程序。 Db2 服务器中有很多功能(取决于您未提及的 Db2 版本)可以准确地告知另一个线程是什么以及两个线程正在运行的 SQL。此外,您使用的是来自 Db2 v10.1 fixpack 4 的非常旧的(不支持的)jdbc 驱动程序,尽管这不是问题的原因。如果您没有有 Db2 DBA,请使用 Db2-server 的 Db2-version+fixpack 更新您的问题。
-
这似乎与您在 2018 年 3 月提出的问题重复,您没有回复答案。 stackoverflow.com/questions/49106741/…
-
嗨@mao,感谢您长期以来的帮助。我终于找到了根本原因,并在下面发布了我的解决方案(针对我的情况)。
标签: java hibernate db2 locking deadlock