2013-10-31 220 views
1

我對如何處理innodb死鎖有點困惑。這裏的acommon情景我已經在網上查到:在InnoDB死鎖後重復交易

while (some deadlock condition) 
{ 
    try { 
     begin transaction 
     query 1 
     query 2 // let's assume this one failed with a deadlock 
     ... 
     query N 
     commit 
    } 
    catch { 
     make sure it's a deadlock AND 
     rollback 
    } 
} 
  • 問題1:因此,假如查詢2失敗,不應該我只是reapeat該查詢,而不是回滾整個事務,只有X之後,回滾嘗試?
  • 問題2:沒有任何額外的隔離指令(即SELECT * FROM table WHERE smth = smth)是否會進入死鎖?

回答

1

Answer 1

事務僵局讓InnoDB 回滾整個事務。發生這種情況時重試整個事務。

答2:

No如果事務隔離水平比SERIALIZABLE降低(或者如果事務之外運行):

SELECT ... FROM是一致讀取,讀取的快照數據庫和設置沒有鎖,除非事務隔離級別設置爲SERIALIZABLE

是如果SERIALIZABLE

對於SERIALIZABLE水平,共享的next-key鎖定在它遇到的索引記錄搜索集。

Remember that

通常情況下,讓他們隨時準備重新發行,如果它被推出,因爲死鎖的回退的事務必須編寫你的應用程序。

A SELECT也可能只是超時,等待來自另一個事務(例如表鎖)的鎖定。

+0

謝謝你解釋 – Marius