我將一個接一個的更新語句從一個servlet調用到DB2。我得到錯誤sqlstate 40001,原因碼68,我發現它是由於死鎖超時。DB2死鎖超時Sqlstate:40001,原因碼68由於使用SQL從servlet調用更新語句
- 如何解決此問題?
- 可以通過設置查詢超時來解決嗎?
- 如果是,那麼如何使用它在servlet中的更新語句或在哪裏使用它?
我將一個接一個的更新語句從一個servlet調用到DB2。我得到錯誤sqlstate 40001,原因碼68,我發現它是由於死鎖超時。DB2死鎖超時Sqlstate:40001,原因碼68由於使用SQL從servlet調用更新語句
原因碼68已經告訴你這是由於鎖定超時(死鎖是原因碼2)這可能是由於在使用將要訪問相同的數據在同一時間運行的查詢其他用戶,或者您自己的多個更新。
首先從db2命令行運行db2pd -db locktest -locks show detail
以查看鎖的位置。然後你需要運行類似:
select tabschema, tabname, tableid, tbspaceid
from syscat.tables where tbspaceid = # and tableid = #
填充與您從db2pd
命令的輸出獲取ID號碼#符號。
一旦你看到那裏的鎖都,這裏有一些提示:
有時可以通過確保所有應用程序訪問自己常用的數據按相同的順序減少◦Deadlock頻率 - 這意味着,例如,他們訪問(並因此鎖定)表A中的行,接着是表B,接着是表C,依此類推。 http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.trb.doc/doc/t0055074.html
推薦閱讀:http://www.ibm.com/developerworks/data/library/techarticle/dm-0511bond/index.html
附錄:
取自如果你的servlet或其他有罪應用程序是使用被發現參與死鎖select
語句,你可以試着在後面加上with ur
的select語句如果新更新(或插入)數據的準確性不重要。
重要的是要指出,文章談論**減少死鎖的頻率,而不是**完全阻止**。根據http://stackoverflow.com/a/112256/14731一致的鎖定順序不會防止死鎖。我們能做的最多的是試圖減少他們的頻率。 – Gili