使用事务首先要数据库支持事务;
如下MySQL数据库user表开启事务支持,即设计表->引擎设置为InnoDB->保存
事务处理
1. 数据库的表引擎需要是 InnoDB 才可以使用,如果不是调整即可;
2. 事务处理,需要执行多个 SQL 查询,数据是关联恒定的;
3. 如果成功一条查询,改变了数据,而后一条失败,则前面的数据回滚;
4. 比如:蜡笔小新给路飞 3 快钱,自己-3,对方+3,这时需要事务处理;
5. 系统提供了两种事务处理的方式,第一种是自动处理,出错自动回滚;
Db::transaction(function () {
Db::name('user')->where('id', 19)->save(['price'=>Db::raw('price - 3')]);
Db::name('user1')->where('id', 20)->save(['price'=>Db::raw('price + 3')]);
});
=========事务回调函数内部给外部变量赋值=======方便操作后根据结果做判断
public function trans(){
$res1=0;
$res2=0;
$res=[];
Db::transaction(function ()use(&$res,&$res1,&$res2){
$res1=Db::table('user')->where(['name'=>'qc'])->setDec('age',2);
$res2=Db::table('user')->where(['name'=>'qzy'])->setInc('age',2);
$res=Db::table('user')->where(['name'=>'qc'])->find();
});
if($res1&$res2){
dump($res1);
dump($res2);
dump($res);
}
return 123;
}
6. 手动处理,基本和原生处理类似,可以自行输出错误信息;
//启动事务
Db::startTrans();
try {
Db::name('user')->where('id', 19)->save(['price'=>Db::raw('price - 3')]);
Db::name('user1')->where('id', 20)->save(['price'=>Db::raw('price + 3')]);
//提交事务
Db::commit();
} catch (\Exception $e) {
echo '执行 SQL 失败!';
//回滚
Db::rollback();
}