java - com.ibm.db2.jcc.am.SqlTransactionRollbackException:DB2 SQL 错误:SQLCODE=-911,SQLSTATE=40001,SQLERRMC=68,DRIVER=3.65.110
问题描述
知道有很多关于这个的问题。这是由于该行数据被其他线程更新,而其他线程无法获取锁。但是,我想更详细地询问:
我有一些代码如下:
// 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 中模拟它。我想知道哪个线程,或者我的代码从哪里我实际上锁定了同一行,然后导致了这个错误。
解决方案
我终于找到了根本原因并设法解决了它。它实际上是由大量的 PHistory 表记录,以及与其他表的许多链接,以及较少的索引造成的。
我db2expln
在这个查询上运行了一个,发现添加建议的索引将提高 99% 的性能。在我添加索引并监控几个月后,好消息是我的程序中不再发生这种异常。
所以,它实际上不是由其他线程更新同一行引起的,我以错误的方式找到了解决方案。直到我检查索引。因此,以后如果遇到类似的问题,不妨试试 index 看看结果。
推荐阅读
- python - 如何仅获取父目录的名称,而不是完整路径?
- debugging - 如何在使用 Segger J-link pro 和 Stm32cubeIDE 进行调试期间暂停看门狗计数器
- java - 如何找出“系统定义的”套接字超时和连接超时是什么?
- python - 如何使用python从PDF中提取文本、表格和图像
- linux - OSX Mojave sysctl -p 非法
- flutter - Flutter 与 SignalR 后端进行身份验证的 WebSocket 通信
- c++ - 从文本文件中提取所有目录名称
- javascript - ASYNC AWAIT 函数在函数中返回未定义
- php - Laravel 注册 - 表单数据未转换为数据库
- time-complexity - lg*(n) 时间复杂度是否优于 lg(n)?