Description

在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用 transaction 方法时还需要亲自去手动还原或提交事务:

DB::transaction(function () {DB::table('users')->update(['votes' => 1]);DB::table('posts')->delete();
});

手动操作事务

如果你想手动处理事务并对还原或提交操作进行完全控制,则可以在 DB facade 使用 beginTransaction 方法:

DB::beginTransaction();

你也可以通过 rollBack 方法来还原事务:

DB::rollBack();

最后,可以通过 commit 方法来提交这个事务:

DB::commit();

注意: DB facade 的事务方法也可以用来控制 查询语句构造器 及 Eloquent ORM 的事务。

Example

假设有要在数据库中存储一个知识点,这个知识点同时属于两个不同的考点,也就是考点和知识点这两个数据是多对多的关系,那么要实现这种数据结构就需要三个表:

知识点表 wiki:

---------------------------------------
id       title              content
---------------------------------------

考点表 tag:

-------------------
id       name
-------------------

考点知识点关联表 wiki_tag_rel

----------------------------------
id          tag_id        wiki_id
----------------------------------

现在要开启事务新增Wiki数据,新增wiki成功后再把它关联到指定的考点上去

(在laravel中使用查询构建器或者Eloquent ORM执行query时,如果失败会返回 Illuminate\Database\QueryException 异常)

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use App\Wiki;class TestController extends Controller
{//用DB facade的事务方法控制 查询语句构建器的事务public function storeWiki(Request $request){DB::beginTransaction();try {$tagIds = explode(',', $request->get('tag_id'));$wiki_id = DB::table('wiki')->insertGetId(['title' => $request->get('title'),'content' => $request->get('content')]);$relationData = [];foreach($tagIds as $tagId) {$data = ['wiki_id' => $wiki_id, 'tag_id' => $tagId];$relationData[] = $data;}DB::table('wiki_tag_rel')->insert($relationData);DB::commit();} catch(\Illuminate\Database\QueryException $ex) {DB::rollback();return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']);}return \Response::json(['status' => 'ok']);}//用DB facade的事务方法控制 Eloquent ORM的事务public function createWiki(array $data){DB::beginTransaction();try {$tagIds = explode(',', $data['tag_id']);$newWiki = Wiki::create(['title' => $data['title'],'content' => $data['content']]);//Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系//通过attach方法来附加wiki和tag的关系(写入中间表)$newWiki->tags()->attach($tagIds);DB::commit();} catch(QueryException $ex) {DB::rollback();return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']);}return \Response::json(['status' => 'ok']);}}

在Laravel中使用数据库事务以及捕获事务失败后的异常相关推荐

  1. php数据迁移脚本,Laravel中数据迁移与数据填充的详细步骤

    前言 这是一篇基础教程,对标 Laravel 文档中的数据迁移和数据填充,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍把. 关于Laravel数据库迁移的理解 最初看到laravel框 ...

  2. mysql 事务批量_mysql事务批量插入

    操作mysql数据库时如果有大量sql操作需要控制要么一起成功,要么一起失败的时候,就需要用到事务操作,一旦使用事务在捕获到失败后就需要 rollback 回滚操作,如果不进行错误检测,可能会导致部分 ...

  3. laravel mysql like_Laravel数据库查询中对 like 的值进行转义

    Laravel数据库查询中对 like 的值进行转义 龙行    PHP    2020-8-20    550    0评论 在laravel开发中,如果我们用到like模糊搜索$where[] = ...

  4. 互联网行业中最常用的数据库——MySQL 索引、事务与存储引擎

    MySQL 索引.事务与存储引擎 一.MySQL 索引 1.1 索引的概念 1.2 索引的作用及缺点 1.2.1 优点 1.2.2 缺点 1.3 创建索引的原则依据 1.4 索引的分类和创建 1.4. ...

  5. oracle repeatable read,Oracle和Mysql中的数据库事务有关问题:Mysql Read-Repeatable有有关问题...

    Oracle和Mysql中的数据库事务问题:Mysql Read-Repeatable有问题 今天不知不觉想到数据库的乐观锁和悲观锁,遂想写个程序测测,却发现了另一个问题,Mysql InnoDB的R ...

  6. phpcms mysql 事务_PHPCMS中mysql数据库优化教程

    PHPCMS中mysql数据库优化教程 在全体的系统运转过程中,数据库服务器 MySQL 的压力是最大的,不只占用很多的内存和 cpu 资源,而且占用着大局部的磁盘 io 资源,连 PHP 的民间都在 ...

  7. 数据库新增幂等操作_使用数据库唯一键实现事务幂等性

    幂等性 概念 在分布式系统中,幂等性是一致性方面的一个重要概念. 幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中. 在编程中一个幂等操作的特点是其任意多 ...

  8. 简单的11步在Laravel中实现测试驱动开发

    测试驱动开发(英语:Test-driven development,缩写为TDD)是一种软件开发过程中的应用方法,由极限编程中倡导,以其倡导先写测试程序,然后编码实现其功能得名. 下文是我在Mediu ...

  9. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪

    SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪 SQL Server 2008中SQL应用系列--目录索引 本文主要介绍SQL Server中记录数据变更的四个方法:触发器.O ...

最新文章

  1. Psych101(part7)--Day7
  2. 推荐一个硬核嵌入式的原创公众号
  3. MySQL教程(三)—— MySQL的安装与配置
  4. linux(4):Linux逻辑卷详解总结
  5. 互联网(IT)大厂面试技巧(面经)
  6. python基础教学PPT讲义(基础部分)
  7. mx播放器有没有投屏功能_无线投屏、即插即用,投影仪其实可以更智能:明基 E580T...
  8. Windows UWF 实现系统重启还原(2021.11.02)
  9. Python如何实现图片显示
  10. Raspberry 4B
  11. mybatis-plus环境搭建
  12. Mac升级文件不见了怎么恢复?
  13. 算法笔记 : 透视变换(透射变换)
  14. python如何对两个矩阵进行拼接_Python:合并两个numpy矩阵的实现
  15. 罗克韦尔编程软件RSLogix5000 win7 64位那什么的方法
  16. mapbox一学就会系列:01 第一个地图页面
  17. 【目标检测】YOLO v5 吸烟行为识别检测
  18. springboot使用actuator
  19. python字符串的特点_字符串特点_清华尹成python入门教程_少儿编程视频-51CTO学院...
  20. window10系统基于theano安装Keras

热门文章

  1. 系统补丁自动批量安装
  2. [Azure][PowerShell][ASM][12]ACL
  3. 开源评论:QQ真的会“开放”和“共享”吗?
  4. HP5200打印机从控制面板手动配置TCP/IP 参数
  5. 重新安装python2.6 和 yum (不可以直接安装yum yum 依赖于python2.6)
  6. 移动前端适配方法总结
  7. Oracle Enterprise Manager 11g 启停
  8. 推销自己的前端技术书籍
  9. C#水晶报表,窗体不显示,闪退
  10. H3C交换机4核心节点IRF2虚拟化下检测机制