COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0911N 由于死锁或超时,已回滚当前事务。原因码“2”。SQLSTATE=40001
IBM 对该问题提供的处理办法
此问题可能是应用程序引起的 DB2 死锁,尤其是访问 DB2 数据源时,遇到类似以下内容的错误:
ERROR CODE: -911 COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0911N 由于死锁或超时,已回滚当前事务。 原因码“2”。SQLSTATE=40001
要诊断此问题:
- 执行这些 DB2 命令:
- db2 update monitor switches using LOCK ON
- db2 get snapshot for LOCKS on dbName >
- 通过运行以下命令关闭锁定监视器:db2 update monitor switchesusing LOCK OFF
要验证是否您有死锁:
- 查找具有锁定等待状态的应用程序句柄,然后查找保持锁定的代理程序标识以验证代理程序的标识。
- 转至该句柄以验证它是否具有锁定等待状态和对此句柄保持锁定的代理程序标识。如果它具有与先前的句柄相同的代理程序标识,那么您知道您具有循环锁定(死锁)。
要解决此问题:
- 如果不需要并发访问,那么检查应用程序并使用较小限制的隔离级别。
- 当更改 accessIntent 值以改变成较低的隔离级别时要小心使用。此更改会导致数据完整性问题:
- 对于 DB2/UDB V7.2 和较早的发行版,您可以从 DB2 命令行窗口设置 DB2_RR_TO_RS 标志以消除不必要的死锁,例如,在 bean 方法上定义的 accessIntent 限制太多(例如,PessimisticUpdate)。DB@_RR_TO_RS 设置具有两个影响:
- 如果 RR 是您选择的隔离级别,它有效地降低为 RS。
- 如果选择另一个隔离级别并且 DB2_RR_TO_RS 设置为开,那么扫描跳过已删除但未落实的行,即使此行可能有扫描资格。跳跃行为影响 RR、读稳定性(RS)和游标稳定性(CS)隔离级别。
例如,考虑事务 A 删除带有 column1=10 的行并且事务 B 在 column1>8 和 column1<12 上扫描的情况。DB2_RR_TO_RS 关闭时,事务 B 等待事务 A 落实或回滚。如果事务 A 回滚,column1=10 的行包含在事务 B 查询的结果集中。DB2_RR_TO_RS 打开时,事务 B 不等待事务 A 落实或回滚。事务 B 立即接收不包含已删除行的查询结果。设置 DB2_RR_TO_RS 有效地更改锁定行为,因此避免死锁。