您的位置:首页 > 数据库 > MySQL

mysql 事物小测试

2015-09-25 11:41 686 查看
$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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: