$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;
}