扫码关注官方订阅号
一般的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
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
哈哈,最近刚把这个功能提交到ThinkPHP主线上,原理是记录事务的嵌套数量,只在最外层提交事务。你可以参考参考:
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