如何从 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 都不是一个好习惯。
一些可能的解决方案:
您的 DBA 应该检查 lock levels for tables 和您的测试环境,并将其与生产环境进行比较。看起来您的测试环境的锁定级别可能太宽泛了。如果是这种情况,将锁定级别设置为 ROW 而不是 PAGE 或 TABLE 应该会有所帮助。
调整会话的 isolation level(例如,您可以在打开连接时执行 SET ISOLATION TO DIRTY READ)。如果您在读取数据时遇到错误,这会有所帮助,但在使用脏读时要小心,因为您可能会遇到幻影记录。
如前所述,调整等待时间,让locker有机会释放锁(打开连接时执行SET LOCK MODE TO WAIT 5;这将使你的线程执行5最多几秒,如果记录仍然被锁定,将引发错误。
有没有办法从 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 都不是一个好习惯。
一些可能的解决方案:
您的 DBA 应该检查 lock levels for tables 和您的测试环境,并将其与生产环境进行比较。看起来您的测试环境的锁定级别可能太宽泛了。如果是这种情况,将锁定级别设置为 ROW 而不是 PAGE 或 TABLE 应该会有所帮助。
调整会话的 isolation level(例如,您可以在打开连接时执行 SET ISOLATION TO DIRTY READ)。如果您在读取数据时遇到错误,这会有所帮助,但在使用脏读时要小心,因为您可能会遇到幻影记录。
如前所述,调整等待时间,让locker有机会释放锁(打开连接时执行SET LOCK MODE TO WAIT 5;这将使你的线程执行5最多几秒,如果记录仍然被锁定,将引发错误。