在PHP中處理MySQL死鎖的最佳做法是什麼?我是否應該將所有數據庫調用都封裝在try {} catch {}塊中,並從數據庫中查找DeadLock錯誤代碼?然後我是否再次重新發布整個交易(我認爲失敗的回滾)?通過PHP檢測MySQL死鎖
1
A
回答
5
死鎖返回錯誤1213
你應該在客戶端處理
注意死鎖和鎖等待是不同的東西。在僵局中,沒有「失敗」的交易:他們都有罪。無法保證哪一個會回滾。
死鎖發生在這樣的場景:
UPDATE t_first -- transacion 1 locks t_first
SET id = 1;
UPDATE t_second -- transaction 2 locks t_second
SET id = 2;
UPDATE t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET id = 2;
UPDATE t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET id = 2;
你確定你不鎖等待混淆呢?
只要事務嘗試鎖定已被另一個事務鎖定的資源,就會發生鎖定等待。
在上面的示例中,在步驟3
上發生鎖定等待。
由於這是一種正常情況(不像死鎖),可以通過提交或回滾持有鎖的事務從外部解決,因此InnoDB
不會嘗試回滾持有該鎖的事務。
取而代之,它將取消在超時發生後嘗試獲取鎖的語句。
默認的超時時間爲50
秒,使用innodb_lock_wait_timeout
進行設置。
失敗的語句(試圖通過獲取的鎖)將返回錯誤1205
。
3
我想從這些引用溫暖的話語MySQL的How to Cope with Deadlocks
常作準備,如果它因爲死鎖而失敗重新發出一個事務。僵局並不危險。再試一次。
這可以通過這樣的方式來實現:
for ($i = 3; true; $i--) {
$pdo->beginTransaction();
try {
// Do the unit of work
$pdo->commit();
break;
} catch (\PDOException $e) {
$pdo->rollback();
if ($i <= 0) {
throw $e;
}
}
}
相關問題
- 1. Mysql死鎖檢測
- 2. MySql:事務不檢測死鎖?
- 3. 通過PHP檢測MySQL InnoDB
- 4. MySQL死鎖問題(PHP/MYSQL)
- 5. 使用DBI檢測死鎖
- 6. 鎖樹算法死鎖檢測
- 7. sqlalchemy + mysql死鎖
- 8. 線程池死鎖:針對或檢測
- 9. 疑難解答aspnet_isapi.dll檢測到死鎖
- 10. 資源分配圖的死鎖檢測
- 11. Oracle如何檢測事務死鎖?
- 12. 腳本來檢測db2死鎖
- 13. 如何檢測Asio庫的死鎖?
- 14. 使用JVMTI進行死鎖檢測
- 15. 如何檢測Django中的死鎖?
- 16. 麻煩實施死鎖檢測算法
- 17. mysql事務死鎖
- 18. MYSQL中的死鎖
- 19. MySQL死鎖問題
- 20. PHP,MySQL PDOException的死鎖異常代碼?
- 21. 通過php mysql的行鎖定
- 22. 通過PHP檢測代理
- 23. 由於Pragma自主事務過程而檢測到死鎖
- 24. 通過信號量避免死鎖?
- 25. 通過TCP套接字的DataOutputStream死鎖
- 26. 通過PHP的PHP cron檢測?
- 27. 使用nUnit測試死鎖
- 28. x單元測試死鎖
- 29. 死鎖預防(Java + MySQL)
- 30. 需要Mysql死鎖解釋
@RomanNewaza:因爲交易雙方鎖定兩個表,儘管在不同的順序。 – Quassnoi 2013-01-29 07:27:52
是的,我明白了。謝謝! – 2013-01-29 07:53:09