laravel学习笔记--事务处理
数据库事务
可以使用 DB facade 的 transaction 方法在数据库事务中运行一组操作。如果事务的闭包 Closure
中出现一个异常,事务将会回滚。如果事务闭包 Closure 执行成功,事务将自动提交。一旦你使用了 transaction ,
就不必担心手动回滚或提交的问题
换句话说,如果在处理过程中发生了异常,就会回滚到处理之前。
比如,在删除一篇文章时,删除了一篇文章的话,是不是还要删除与它相关的评论,如果在删除文章过程中发生了异常,那么这些评论就会造成数据堆积,造成大量的垃圾数据,就会拖慢我们的服务器运行,所以,使用事务可以处理这些问题
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
死锁
transaction 方法接受一个可选的第二个参数 ,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
手动使用事务
有时候我们不需要使用闭包的方式,我们需要的是自己去控制数据提交和事务处理,那么,就会使用到手动使用事务
如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用 DB Facade 的 beginTransaction 方法
手动使用事务的话,是要自己开启事务的
DB::beginTransaction();//开启事务
手动使用事务流程
//手动使用事务
DB::beginTransaction();//开启事务
try {
//这里是数据库操作,一旦这里发送错误,
//就会抛出异常,就不会到提交那一步
//提交数据--无异常才可以提交
DB::commit();
}catch (Exception $e){
//进行回滚操作
DB::rollBack();
}
例如,我删除文章的同时再删除评论
//开启事务
DB::beginTransaction();
try {
//删除博客
$blog->delete();
//删除博客相关评论
$blog->comments()->delete();
//提交事务
DB::commit();
return response()->api('删除成功');
} catch ( Exception $e) {
//回滚
DB::rollBack();
return response()->api('删除失败', 400);
}
版权声明:
作者:linrux
链接:https://www.tot7.cn/technology/php/161.html
来源:Code林
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论