前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Laravel DB类实现事务

Laravel DB类实现事务

作者头像
切图仔
发布于 2022-09-08 11:06:38
发布于 2022-09-08 11:06:38
92300
代码可运行
举报
文章被收录于专栏:生如夏花绚烂生如夏花绚烂
运行总次数:0
代码可运行

事务

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

事务有四个特性

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

原子性

一个事务的所有操作,要么全部完成,要么都不完成,如果在事务执行过程中发送错误则会回滚到事务开始前的状态。

一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。即写入的数据必须符合所有预设规则。

隔离性

数据库允许多个并发事务同时对其数据库进行读写与修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据库的不一致。事务隔离分为不同级别 ,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

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

DB类实现事务

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DB::transaction(function(){
...事务执行

})

事务传参

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DB::transaction(function () use ($arguments){
....

})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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():提交事务

如下简单示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档