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
来源:阿信博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>