2011-11-16 99 views
3

我想在一個項目中使用MySQL事務,但之前沒有使用它們,我想我會讀到任何潛在的問題。我在http://mysqldatabaseadministration.blogspot.com/2007/04/innodb-performance-optimization.html找到一篇文章,提示死鎖很常見,您的應用程序應該能夠處理它們。MySQL事務陷阱

在這種情況下,「死鎖」是指什麼?據我所知,交易不會鎖定數據庫,因此它不能鎖定。我將如何去處理這樣的問題。

我還有其他問題需要注意嗎?

回答

1

事務確實鎖定了數據庫。如果兩個交易正在等待對方,你就會陷入僵局。

交易1:

lock table1; 
lock table2; 

事務2:

lock table2; 
lock table1; 

如果現在交易雙方做了他們的第一個步驟,他們互相等待。你必須避免這樣的序列。

3

當事務1(寫入)資源A和在此期間交易2獲取資源B.死鎖可能發生

現在想象一下,事務2想要的資源A,但忙碌,因此必須等待,事務嘗試獲取資源B,並且發現它也很忙。你有一個循環的等待,一個僵局。事務1正在等待事務2持有的資源,事務2正在等待事務1的資源。兩個事務都不能繼續。這是最簡單的例子,鏈條可以更長。

MySQL的InnoDB檢測到死鎖並殺死其中一個事務,使其失敗。

,你能做些什麼來避免此問題是:

  • 簡單地重試事務,例如,你可以重試3次(在高併發環境下進行試驗,就像一個魅力)
  • 獲得資源以相同的順序。如果事務1和2需要第一個資源A,然後B需要相同的順序,則問題不會發生
+0

謝謝。你怎麼知道交易已經回滾?目前,我檢查交易中的每個查詢是否成功,以便知道是否提交。如果出現回滾,至少其中一個會失敗,這似乎是合理的,或者是否有標準的檢查方式?在Java中 – wyatt

+0

有一個特定的異常,我可以查詢,你的編程語言是什麼?我認爲你所說的話應該是一個合理的檢查方式。 – stivlo