一般的PHP架構是如何處理MySQL事務多次開啟和事務操作嵌套的?求架構源碼
回複內容:
一般的PHP架構是如何處理MySQL事務多次開啟和事務操作嵌套的?求架構源碼
哈哈,最近剛把這個功能提交到ThinkPHP主線上,原理是記錄事務的嵌套數量,只在最外層提交事務。你可以參考參考:
public function startTrans(){ $this->initConnect(true); if (!$this->_linkID) { return false; } //資料rollback 支援 if (0 == $this->transTimes) { // 記錄當前操作PDO $this->transPdo = $this->_linkID; $this->_linkID->beginTransaction(); } $this->transTimes++; return;}public function commit(){ if ($this->transTimes == 1) { // 由嵌套事物的最外層進行提交 $result = $this->_linkID->commit(); $this->transTimes = 0; $this->transPdo = null; if (!$result) { $this->error(); return false; } } else { $this->transTimes--; } return true;}public function rollback(){ if ($this->transTimes > 0) { $result = $this->_linkID->rollback(); $this->transTimes = 0; $this->transPdo = null; if (!$result) { $this->error(); return false; } } return true;}
https://github.com/youmingdot/thinkphp/blob/master/ThinkPHP/Library/Think/Db/Driver.class.php#L267-L328
https://github.com/yeaha/owl/blob/master/src/Service/DB/Adapter.php#L132-L183