如何从 Java 释放 Informix 锁

How to release Informix lock from Java

有没有办法从 Java 释放 Informix 中的锁?

[Error Code: -107, SQL State: IX000]  ISAM error: record is locked

在我们的测试环境中,我们有很多锁异常,解决它的唯一方法是重启数据库。

PS: 我不是在寻找数据库专家的解决方案。我想从 Java 或 Groovy.

解决这个问题

发生的情况是其他用户锁定了您想要的记录;这通常是暂时的,使用 SET LOCK MODE TO WAIT 往往就够了。

但是这个错误可以通过使用索引来避免,如果它们已经存在那么数据分布已经过时了,你需要UPDATE STATISTICS.

你真的应该和你的 DBA 谈谈这种行为。

要查找锁定了相关 table 的会话,您可以使用 syslocks table:

SELECT  * 
FROM    sysmaster:syslocks
WHERE   dbsname     = '<DATABASE>'
        AND tabname = '<TABLE>';

要终止会话,您必须能够发出 onmode -z

这不是一个好的做法,即使它是一个测试环境。测试环境的目的是调试,这不是调试。但是弹跳 IDS 都不是一个好习惯。

一些可能的解决方案:

  1. 您的 DBA 应该检查 lock levels for tables 和您的测试环境,并将其与生产环境进行比较。看起来您的测试环境的锁定级别可能太宽泛了。如果是这种情况,将锁定级别设置为 ROW 而不是 PAGE 或 TABLE 应该会有所帮助。

  2. 调整会话的 isolation level(例如,您可以在打开连接时执行 SET ISOLATION TO DIRTY READ)。如果您在读取数据时遇到错误,这会有所帮助,但在使用脏读时要小心,因为您可能会遇到幻影记录。

  3. 如前所述,调整等待时间,让locker有机会释放锁(打开连接时执行SET LOCK MODE TO WAIT 5;这将使你的线程执行5最多几秒,如果记录仍然被锁定,将引发错误。