下面这一块代码内有错误被我的trycatch捕获到了,但是我用于测试事务回滚的setInc仍然改变了数据库
Db::startTrans();
try {
//所有原因项
$all = Db::table('yoshop_xl_reportreason')->field('title,display,id as value')->lock(true)->select()->toArray();
//$data是所有要启用的原因项的id
if(!$all){
Db::rollback();
return ['code'=>0,'msg'=>'保存失败:当前暂无任何原因项,请刷新页面后添加原因项目再试'];
}
//测试事务回滚是否生效
Db::table('yoshop_xl_reportreason')->where('id',5)->setInc('display',1);
//取所有原因项的id数组取差集,差集为所有不使用的原因项
$all = array_column($all, 'value');
//差集
$result=array_diff($all,$data);
if($result){
$res1 =Db::table('yoshop_xl_reportreason')->where('id','in',$result)->update(['display'=>1]);
if($res1 === false){
Db::rollback();
return ['code'=>0,'msg'=>'保存失败:更新不启用项时出错'];
}
}
if($data){
$res2 =Db::table('yoshop_xl_reportreason')->where('id','in',$data)->update(['display'=>2]);
if($res2 === fasle){
Db::rollback();
return ['code'=>0,'msg'=>'保存失败:更新启用项时出错'];
}
}
Db::commit();
return ['code'=>1,'msg'=>'保存成功'];
}catch (\Exception $e) {
Db::commit();
return ['code'=>0,'msg'=>$e->getMessage()];
}
明显是事务没有成功回滚,我看了一下Tp5的源码,commit()是未开启自动提交时的提交,我怀疑是我没有关闭自动提交,请问怎么关闭,最好是暂时关闭,事务执行后再开启。
。。原来是catch里的rollback 写成了commit 的原因,zbc