tp6/thinkphp6事务操作
使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。
最简单的方式是使用 transaction 方法操作数据库事务,当闭包中的代码发生异常会自动回滚,例如:
Db::transaction(function () { Db::table('think_user')->find(1); Db::table('think_user')->delete(1); });
也可以手动控制事务,例如:
// 启动事务 Db::startTrans(); try { Db::table('think_user')->find(1); Db::table('think_user')->delete(1); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); }
注意在事务操作的时候,确保你的数据库连接使用的是同一个。
可以支持MySQL的XA事务用于实现全局(分布式)事务,你可以使用:
Db::transactionXa(function () { Db::connect('db1')->table('think_user')->delete(1); Db::connect('db2')->table('think_user')->delete(1); }, [Db::connect('db1'),Db::connect('db2')]);
实例 实例 实例 注意 注意 注意
<?php use think\facade\Db; //有多少人不带这个就开始的??? // 启动事务 Db::startTrans(); try { $uid = Comment::where('id',input('id'))->value('uid');//查会员ID if (!$uid) { throw new \Exception('未查到会员UID'); } $u_data = U::where(['id'=>$uid])->save(['comment'=>1]);//会员限评 if (!$u_data) { throw new \Exception('禁止会员评论失败'); } $c_data = Comment::where(['id'=>input('id')])->save(['status'=>0]); if (!$c_data) { throw new \Exception('禁止评论展示失败'); } // 提交事务 Db::commit(); return $this->success('封禁评论及会员评论功能成功'); } catch (\Exception $e) { // 回滚事务 Db::rollback(); return $this->fail($e->getMessage()); } ?>
如果抛出致命错误: Class 'app\api\validate\Exception' not found
请注意:throw new \Exception 或者 throw new \think\Exception 有没有在Exception前边带上\杠
我要反馈