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前边带上\杠
我要反馈
