TP5 Db事务、单模型事务及多模型事务写法
2019-06-21 本文已影响0人
peterz博客
Db事务写法
Db::startTrans();
try {
Db::name('shop_comments')->strict(false)->insert($param);
Db::name('shop_order')->where('id', $param['shop_order_id'])->setField('is_comment', 1); // 将订单表中 是否评价状态设为1
Db::commit();
success('评价成功');
} catch (Exception $e) {
Db::rollback();
error('评价失败');
}
单模型事务
$model = model('user_address');
$model->startTrans();
try {
//将当前用户所有收货地址取消默认状态
if($model->where('user_id', $user_id)->count('id')){
$model->where('user_id', $user_id)->setField('is_default', 0);
}
//新增
$param = $this->request->param();
$param['user_id'] = $user_id;
$param['is_default'] = 1; // 设为默认地址
$model->allowField(true)->save($param);
$model->commit();
success('添加收货地址成功');
} catch (Exception $e) {
$model->rollback();
error('添加收货地址失败');
}
多模型事务
public function transaction()
{
$modelA = model('A');
$modelA->startTrans(); // 开启事务A
$result = $modelA->save($data1);
if($result === false){
$modelA->rollBack(); // 事务A回滚
$this->error('添加A信息失败,请重试');
}
$modelB = model('B');
$modelB->startTrans(); // 开启事务B
$result = $modelB->save($data2);
if($result === false){
$modelB->rollBack(); // 事务B回滚
$modelA->rollBack(); // 事务A回滚
$this->error('添加B信息失败,请重试');
}
$modelC = model('C');
$modelC->startTrans(); // 开启事务C
$result = $modelC->save($data3);
if($result === false){
$modelC->rollBack(); // 事务C回滚
$modelB->rollBack(); // 事务B回滚
$modelA->rollBack(); // 事务A回滚
$this->error('添加C信息失败,请重试');
}
// 提交事务
$modelC->commit();
$modelB->commit();
$modelA->commit();
$this->success('添加成功', url('index'));
}