一般的PHP框架是如何處理MySQL事務(wù)多次開啟和事務(wù)操作嵌套的?求框架源碼
業(yè)精于勤,荒于嬉;行成于思,毀于隨。
哈哈,最近剛把這個(gè)功能提交到ThinkPHP主線上,原理是記錄事務(wù)的嵌套數(shù)量,只在最外層提交事務(wù)。你可以參考參考:
public function startTrans()
{
$this->initConnect(true);
if (!$this->_linkID) {
return false;
}
//數(shù)據(jù)rollback 支持
if (0 == $this->transTimes) {
// 記錄當(dāng)前操作PDO
$this->transPdo = $this->_linkID;
$this->_linkID->beginTransaction();
}
$this->transTimes++;
return;
}
public function commit()
{
if ($this->transTimes == 1) {
// 由嵌套事物的最外層進(jìn)行提交
$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