有没有办法从Java中释放Informix中的锁?
[Error Code: -107, SQL State: IX000] ISAM error: record is locked
在我们的测试环境中,我们有很多锁定异常,解决问题的唯一方法就是重启数据库。
PS:我不是在寻找数据库专家的解决方案。我想从Java或Groovy解决这个问题。
答案 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)
一些可能的解决方案:
您的DBA应检查lock levels for tables和测试环境,并将其与生产环境进行比较。看起来您的测试环境中的锁定级别可能太宽泛了。如果是这种情况,将锁定级别设置为ROW而不是PAGE或TABLE应该会有所帮助。
调整会话的isolation level(例如,您可以在打开连接时执行SET ISOLATION TO DIRTY READ)。如果您在读取数据时遇到错误,这可能有所帮助,但在使用脏读时要小心,因为您可能会遇到虚假记录。
如前所述,调整等待时间以使锁定器有机会释放锁定(打开连接时执行SET LOCK MODE TO WAIT 5;这将使您的线程最多执行5秒钟,如果记录仍然被锁定,则会引发错误。