Laravel DB类实现事务

事务

事务主要用于处理操作量大,较复杂的数据,如在某个场景你想删除某个用户,但又要删除这个用户相关的信息,这种操作就构造一个事务。
事务有四个特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

原子性
一个事务的所有操作,要么全部完成,要么都不完成,如果在事务执行过程中发送错误则会回滚到事务开始前的状态。
一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。即写入的数据必须符合所有预设规则。
隔离性
数据库允许多个并发事务同时对其数据库进行读写与修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据库的不一致。事务隔离分为不同级别 ,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

注意:在MySQL中只有使用了InnoDB数据库引擎的数据表才能实现事务

DB类实现事务

通过transaction方法实现事务,该方法不需要你手动设置,回滚,事务提交。当事务中发生错误时会自动抛出异常并回滚到事务执行之前的状态

DB::transaction(function(){
...事务执行

})

事务传参
由于事务中使用的是匿名函数,给匿名函数传参需按照下面格式

DB::transaction(function () use ($arguments){
....

})
 DB::transaction(function () use ($req){
       
        Pro::where('id',$req->id)->update(['money'=>$req->money]);
            DB::table('inves')->insert(['uid'=>Auth::user()->id,'pid'=>$req->id,'money'=>$req->money,'status'=>1,'pubtime'=>time()]);

        });

手动操作事务
手动操作事务,控制事务回滚,事务提交
DB::beginTransaction():开启事务
DB::rollback():事务回滚
DB:commit():提交事务
如下简单示例

DB::beginTransaction();
try {
    Pro::where('id',$req->id)->update(['money'=>$req->money]);
    DB::table('inves')->insert(['uid'=>Auth::user()->id,'pid'=>$req->id,'money'=>$req->money,'status'=>1,'pubtime'=>time()]);
} catch(\Exception $e)
{
     DB::rollback();//事务回滚
     throw $e;
 }
       
DB::commit();
发布了88 篇原创文章 · 获赞 2 · 访问量 2984

猜你喜欢

转载自blog.csdn.net/weixin_45143481/article/details/104710304