Laravel DB类实现事务

本文详细介绍了事务在处理复杂数据中的重要性,包括其原子性、一致性、隔离性和持久性。讲解了如何在MySQL中使用InnoDB引擎实现事务,以及通过DB类的transaction方法和手动操作事务的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

})
1
2
3
4
 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()]);

        });
1
2
3
4
5
6
手动操作事务
手动操作事务,控制事务回滚,事务提交
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();
————————————————
版权声明:本文为优快云博主「zihanzy.com」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_45143481/article/details/104710304

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值