在一个特别请求的DB2表中,由分布式Java桌面应用程序通过JDBC访问,我每天都会多次获得以下场景:
客户端A想要插入新的寄存器并在表上获得IX锁定,并且X锁定在每个新行中;
其他客户希望执行SELECT,在表上被授予IS锁,但应用程序卡住了;
客户端A继续工作,但是INSERT和UPDATE查询没有被提交,锁没有被释放,并且它不断地为每一行收集X锁;
客户A退出其工作未提交。其他客户端最终获得他们的SELECT结果集。
过去运作良好,并且大部分时间都有效,但锁定情况越来越频繁。
自动提交已开启。
在日志中没有抛出异常或检测到错误。
DB2 9.5 / JDBC驱动程序9.1(JDBC 3规范)
答案 0 :(得分:0)
如果jdbc应用程序没有执行COMMIT,那么锁将一直存在,直到回滚或提交为止。如果应用程序退出未提交的插入,则会对所有最新版本的Db2进行回滚。这是Linux / Unix / Windows上Db2的预期行为。
如果jdbc应用程序未能提交,那么它将被破坏或配置错误,因此如果您寻求永久解决方案,则必须找到原因。
如果其他客户端希望忽略插入行锁,那么他们应该选择正确的隔离级别和,您可以配置Db2以跳过插入锁。请参阅此link
上的文档DB2_SKIPINSERTED答案 1 :(得分:0)
事实证明,有时自动提交,我不知道为什么,会变成应用程序的随机单个实例。
以下验证似乎解决了问题(但不是解决问题的根源):
if (!conn.getAutoCommit()) {
conn.commit();
}