DB2 Exclusive Lock未发布

时间:2018-04-02 16:18:45

标签: jdbc db2 db2-luw

在一个特别请求的DB2表中,由分布式Java桌面应用程序通过JDBC访问,我每天都会多次获得以下场景:

  1. 客户端A想要插入新的寄存器并在表上获得IX锁定,并且X锁定在每个新行中;

  2. 其他客户希望执行SELECT,在表上被授予IS锁,但应用程序卡住了;

  3. 客户端A继续工作,但是INSERT和UPDATE查询没有被提交,锁没有被释放,并且它不断地为每一行收集X锁;

  4. 客户A退出其工作未提交。其他客户端最终获得他们的SELECT结果集。

  5. 过去运作良好,并且大部分时间都有效,但锁定情况越来越频繁。

    自动提交已开启。

    在日志中没有抛出异常或检测到错误。

    DB2 9.5 / JDBC驱动程序9.1(JDBC 3规范)

2 个答案:

答案 0 :(得分:0)

如果jdbc应用程序没有执行COMMIT,那么锁将一直存在,直到回滚或提交为止。如果应用程序退出未提交的插入,则会对所有最新版本的Db2进行回滚。这是Linux / Unix / Windows上Db2的预期行为。

如果jdbc应用程序未能提交,那么它将被破坏或配置错误,因此如果您寻求永久解决方案,则必须找到原因。

如果其他客户端希望忽略插入行锁,那么他们应该选择正确的隔离级别,您可以配置Db2以跳过插入锁。请参阅此link

上的文档DB2_SKIPINSERTED

答案 1 :(得分:0)

事实证明,有时自动提交,我不知道为什么,会变成应用程序的随机单个实例。

以下验证似乎解决了问题(但不是解决问题的根源):

if (!conn.getAutoCommit()) {

    conn.commit();
}