我有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隔離級別下構建和使用的,後來我進行了更改。
一些代碼會走很長的路。這聽起來像你遇到與變量同步的問題。這可能是由於事務處於回滾狀態等原因造成的。 – Namphibian 2012-04-12 12:32:39
對不起,我澄清了我以前的評論,這聽起來像您在變量/數據庫狀態處於未提交/回滾狀態時遇到問題。 – Namphibian 2012-04-12 12:43:16
那麼,在閱讀相關文章後,似乎並不是正確的做法。我需要爲每個線程完全隔離的數據,所以我的洞察力可能與6個鏡像數據庫一起工作。 – Joucks 2012-04-12 16:20:58