时间:2021-07-01 10:21:17 帮助过:9人阅读
一般的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