$goodsModel = M('mall.Goods');
$usermodel = M('user.User');
$shopModel = M('mall.Shop');
try {
//事物不能跨庫 有一個model使用事物則必須都使用事物 同庫下一個事物即可 中途修改的值立即生效 出現異常則rollback
$goodsModel->beginTransaction();
$usermodel->beginTransaction();
$goodsModel->updateById(['StockCount'=>500], 80);
$shopModel->updateById(['GoodsCount'=>10], 100274);
$usermodel->updateById(['Money' => 7], 3);
echo $goodsModel->fetchById(80)['StockCount'];//500
throw new \Exception('interupt', 211);
$goodsModel->commit();
$usermodel->commit();
die('modify success!');
} catch (Exception $e) {
$goodsModel->rollback();
$usermodel->rollback();
echo $e->getMessage();
}
如果goodsModel 和userModel 使用的PDO對象是同一個 則屬於同一事物
反之爲2個事務 ,這也是爲什麼在mysql控制檯測試時 事物可跨庫的問題
PDO多事務程序處理:
protected $transactionCounter = 0;
function beginTransaction() {
if(!$this->transactionCounter++)
return parent::beginTransaction();
return $this->transactionCounter >= 0;
}
function commit() {
if(!--$this->transactionCounter)
return parent::commit();
return $this->transactionCounter >= 0;
}
function rollback() {
if($this->transactionCounter >= 0) {
$this->transactionCounter = 0;
return parent::rollback();
}
$this->transactionCounter = 0;
return false;
}