2012-04-12 92 views
1

我有6個腳本/任務。它們中的每一個都啓動一個MySQL事務,然後完成它的工作,這意味着從MySQL數據庫中選擇/更新/插入/刪除,然後回滾。多線程交易的MySQL配置

因此,如果數據庫是在給定的狀態S,我推出一個任務,當任務結束時,數據庫是回到狀態S.

當我按順序啓動腳本,一切工作正常:

  • DB在狀態S
  • 任務1
  • DB在狀態S
  • 任務2
  • DB在ST吃了小號
  • ...
  • ...
  • 任務6
  • DB在狀態S

,但我想,以加快由多個線程進程,啓動腳本在平行下。

  • DB在狀態S的同時
  • 6任務
  • DB在狀態S

有些任務會隨機失敗,我有時會收到此錯誤:

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction 

我不明白,我認爲交易是爲了這個。有什麼我失蹤?任何經驗,建議,線索都是值得歡迎的。

MySQL的配置是:

innodb_lock_wait_timeout = 500 
transaction-isolation = SERIALIZABLE 

和我在每個會話開始時添加AUTOCOMMIT = 0。

PS:數據庫是在REPEATABLE READ隔離級別下構建和使用的,後來我進行了更改。

+0

一些代碼會走很長的路。這聽起來像你遇到與變量同步的問題。這可能是由於事務處於回滾狀態等原因造成的。 – Namphibian 2012-04-12 12:32:39

+0

對不起,我澄清了我以前的評論,這聽起來像您在變量/數據庫狀態處於未提交/回滾狀態時遇到問題。 – Namphibian 2012-04-12 12:43:16

+0

那麼,在閱讀相關文章後,似乎並不是正確的做法。我需要爲每個線程完全隔離的數據,所以我的洞察力可能與6個鏡像數據庫一起工作。 – Joucks 2012-04-12 16:20:58

回答

0

您可以通過確保每個事務/進程在所有情況下都具有相同ORDER BY的所有所需數據/表執行SELECT ... FOR UPDATE操作,並且具有相同的表本身順序(至少在MySQL中可重複讀取隔離級別)。

除此之外,隔離級別和事務是而不是意思是處理死鎖,反之亦然,它們是死鎖存在的原因。如果遇到死鎖,很可能會出現數據集狀態不一致的情況(這可能更嚴重 - 如果不是這樣,您可能根本不需要交易)。