有沒有辦法從Java中釋放Informix中的鎖?如何從Java發佈Informix鎖
[Error Code: -107, SQL State: IX000] ISAM error: record is locked
在我們的測試環境中,我們有很多鎖異常以及如何解決它正在重新啓動數據庫的唯一方法。
PS:我不看數據庫專家的解決方案。我想從Java或Groovy解決這個問題。
有沒有辦法從Java中釋放Informix中的鎖?如何從Java發佈Informix鎖
[Error Code: -107, SQL State: IX000] ISAM error: record is locked
在我們的測試環境中,我們有很多鎖異常以及如何解決它正在重新啓動數據庫的唯一方法。
PS:我不看數據庫專家的解決方案。我想從Java或Groovy解決這個問題。
發生什麼事是另一個用戶鎖定了你想要的記錄;這通常是短暫的,並且使用SET LOCK MODE TO WAIT 傾向於足夠。
但是,通過使用索引可以避免這個錯誤,如果它們已經存在,那麼數據分佈是過時的,並且您需要更新統計信息。
你真的應該談談你的DBA這種行爲。
要找到具有在表鎖的問題,你可以使用會話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)。如果您在閱讀數據時遇到錯誤,這可能會有所幫助,但在使用髒讀時請小心,因爲您可能會遇到鬼記錄。
如前所述,調整等待時間段以給予鎖機構釋放鎖的機會(打開連接時執行SET LOCK MODE TO WAIT 5;這會使您的線程最多執行5秒,並且如果記錄仍然被鎖定,將會引發錯誤)。
你首先要考慮爲什麼數據庫上的鎖都沒有...... – Copilot
是的,我知道,但是,這一鎖定時,我需要殺了他,並嘗試另一個attem修復它 – hudi
否;你不需要殺死一些東西 - 你需要確保你的所有代碼運行良好,並在完成對象時釋放鎖定。這可能意味着強制執行COMMIT操作。 Java具有垃圾回收功能,並且事情得到清理的時間並不是非常確定的;這可能會使生活複雜化。但是正確編寫的代碼不會長時間保持鎖定狀態,因此很少有機會運行到其他進程的鎖中。 –