要知道这方面有很多问题。这是因为数据行是由其他线程更新的,而另一个线程无法获取锁。不过,我想提出更多细节:
我有如下代码:
// 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是主线程,并且它是唯一的。
然而,我一直在生产中击中这个东西,我不能模拟它在我的本地,或坐或UAT。我试图知道哪个线程,或者代码中的哪个线程,我实际上锁定了同一行,然后导致了这个错误。
发布于 2019-04-10 15:27:54
我终于找到了根源,并设法解决了。它实际上是由大量的PHistory表记录,以及与其他表的许多链接,以及较少的索引造成的。
我在这个查询上运行了一个db2expln
,发现添加建议的索引将提高99%的性能。在我添加索引和监视几个月之后,好消息就不会再发生在我的程序中了。
所以,它实际上不是由其他线程更新同一行引起的,我是以错误的方式找到解决方案的。直到我检查索引。因此,在将来,如果有类似的问题发生在您身上,不如尝试一下索引并查看结果如何。
https://stackoverflow.com/questions/50229659
复制相似问题