如何从Java发布Informix锁

时间:2015-06-12 09:28:46

标签: java informix

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

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

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

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

2 个答案:

答案 0 :(得分:1)

另一个用户锁定了您想要的记录;这通常是短暂的并使用SET LOCK MODE TO WAIT 往往足够了。

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

您真的应该与 DBA 讨论此行为。

要查找对相关表有锁定的会话,您可以使用syslocks table

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

要杀死会话,您必须能够发出onmode -z

即使是测试环境,这也不是一个好习惯。测试环境的目的是调试,这不是调试。但是没有弹出 IDS 是一种很好的做法。

答案 1 :(得分:0)

一些可能的解决方案:

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

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

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