2013-02-23 27 views
1

我有一些問題,下面的語句,有沒有人有任何想法?使用此SQL語句檢測到死鎖?

任何意見的讚賞!

UPDATE tableTx 
SET tableTx.ResultCode = 0 
WHERE tableTx.id in (SELECT tableTxInfo.id 
        FROM tableTxInfo 
        WHERE tableTxInfo.messageId = 'john-to-bob' 
        and tableTx.ResultCode != 1) 

tableTxtableTxInfoid是相同的(它用作INTEGER PRIMARY KEY) 對於一個新的事務,一個新的記錄,才能既爲tableTxtableTxInfo用相同的ID創建。

我有大約40000條記錄與messageId = "john-to-bob"

當我試圖從兩個不同的線程執行上面的SQL語句,一個掛了相當長的時間,另一個線程只是得到的迴應:

事務檢測到死鎖時,事務回滾。

我對SQL和數據庫概念還不是很熟悉。有什麼辦法可以防止這種錯誤?

我的數據庫是IBM solidDB的

+0

你有沒有試過這個40k的子集?可能是因爲腳本認爲腳本處於死鎖狀態需要很長時間。 – PCoelho 2013-02-23 09:15:53

+1

嘗試先在桌子上設置寫鎖定。 – 2013-02-23 09:18:56

+0

感謝您的評論,PCoelho是正確的,操作花了這麼長時間,以便另一個線程超時,並返回該死鎖錯誤。修改SQL語句後問題消失~~ – kai 2013-02-23 14:35:56

回答

2

你可以嘗試這樣的:

UPDATE tableTx 
SET tableTx.ResultCode = 0 
WHERE tableTx.id in (SELECT tableTxInfo.id 
        FROM tableTxInfo 
        WHERE tableTxInfo.messageId = 'john-to-bob') 
     AND tableTx.ResultCode != 1; 

這可能會阻止這兩個查詢之間的循環依賴。

祝你好運!

+0

感謝mrhobo,它變得更快。 – kai 2013-02-23 14:33:46