2013-02-28 93 views
0

我們擁有一個包含四個克隆的WebSphere集羣。相同的代碼在每個克隆上運行。我們Quartz定期啓動一個運行代碼的工作。DB2鎖定超時

代碼嘗試更新表中的一行,以便只有一個克隆能夠成功更新表,然後該克隆將運行剩餘的工作。例如:

update <table> set status = 'RUNNING' where job_name = 'JOB1' and status = 'STOPPED' 

當我們執行更新語句時,我們不啓動事務。

我們有時看到的是,所有四個克隆都無法更新表,並且全部都獲得鎖超時錯誤(sql代碼-913)。我們還嘗試了一個替代方案,我們開始一個事務,選擇查看該行是否標記爲正在運行,如果沒有,則執行更新和提交;否則回滾。

這有同樣的問題。

我們還沒有嘗試的一個解決方案是將select修改爲「select for update」,雖然從我的googleing中,我懷疑這是否會有所幫助。

有什麼建議嗎?

+0

什麼版本的DB2?什麼是完整的錯誤信息?你確定沒有別的東西在觸摸那張桌子,並且沒有觸發器(或類似的)?語句的運行頻率如何 - 是否有可能以前的事務仍在運行?像這樣運行'UPDATE'可能是你最好的選擇。 – 2013-03-01 18:22:38

回答

0

這最終沒有成爲一個問題(這是我得到的聆聽某人沒有自己檢查出來)。

我在我們的開發環境中測試了兩個克隆。其中一個克隆偶爾會看到-913鎖定超時錯誤,而另一個克隆會成功更新該表。除了醜陋的日誌消息之外,所有事情都應該如此。

但是,通常情況下,我們不會得到-913錯誤,而是一個警告,指示沒有行要從其中一個克隆進行更新。再次,這種行爲是好的。

因此,正如我們原先所想的那樣,Clockwork-Muse也建議,以這種方式使用UPDATE語句來強制鎖定在DB2中工作得很好。