一般的PHP框架是如何处理MySQL事务多次开启和事务操作嵌套的?求框架源码
一般的PHP框架是如何处理MySQL事务多次开启和事务操作嵌套的?求框架源码
哈哈,最近刚把这个功能提交到ThinkPHP主线上,原理是记录事务的嵌套数量,只在最外层提交事务。你可以参考参考:
<code>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; } </code>
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