当前位置: 首页 > 编程笔记 >

laravel 解决多库下的DB::transaction()事务失效问题

孟跃
2023-03-14
本文向大家介绍laravel 解决多库下的DB::transaction()事务失效问题,包括了laravel 解决多库下的DB::transaction()事务失效问题的使用技巧和注意事项,需要的朋友参考一下

问题:最近使用laravel的DB::transaction()方法进行事务操作时,发现事务总是无效的。代码如下:

DB::transaction(function () use ($uid, $roleId) {
 RoomUserRole::insert([
  'uid' => $uid,
  'role_id' => $roleId,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

 RoomUserRoleLog::insert([
  'uid' => $uid,
  'handle_type' => 1,
  'admin_uid' => Auth::user()->id,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

});

以上mysql 第二句会报错抛出一个异常, 查看数据库时第一句依然出入成功。查看laravel的DB::transaction()的使用

原因以及解决方法:

项目使用多个数据库配置,DB::transaction()使用的是默认库的事务操作。所以要指定哪个数据库的事务,以上代码调整:

DB::connection('mysql2')->transaction(function () use ($uid, $roleId) {
 RoomUserRole::insert([
  'uid' => $uid,
  'role_id' => $roleId,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

 RoomUserRoleLog::insert([
  'uid' => $uid,
  'handle_type' => 1,
  'admin_uid' => Auth::user()->id,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

}); // 这样你会发现事务才正常回滚

同样

DB::connection('mysql_chat_room')->beginTransaction();
DB::connection('mysql_chat_room')->commit();
DB::connection('mysql_chat_room')->rollBack(); // 指定库,不然都会跑默认配置库的事务

以上这篇laravel 解决多库下的DB::transaction()事务失效问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍iOS下Safari点击事件失效的解决方法,包括了iOS下Safari点击事件失效的解决方法的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于在iOS下Safari浏览器点击事件失效的相关解决方案,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 问题描述 当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body

  • 主要内容:事务管理方式,事务管理器,TransactionStatus 接口事务(Transaction)是基于关系型数据库(RDBMS)的企业应用的重要组成部分。在软件开发领域,事务扮演者十分重要的角色,用来确保应用程序数据的完整性和一致性。 事务具有 4 个特性:原子性、一致性、隔离性和持久性,简称为 ACID 特性。 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的动作要么都做要么都不做。 一致性(Consistency):事务必须保证数

  • Note 本文档翻译自: http://redis.io/topics/transactions 。 MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务的基础。 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作

  • 问题内容: 我们都使用多个插入查询。这样做时,应该将其放置在内部还是包裹起来?甚至有必要在交易出现问题时自动将交易失败的情况包括在内吗? 包装交易的样本: 相反,包装try … catch: 或只是一笔没有交易的交易…抓住 问题答案: 如果您需要通过代码手动“退出”交易(通过异常还是只是检查错误状态),则不应使用,而是将代码包装在and /中: 请参阅交易文档。

  • 本文向大家介绍解决layer.open后laydate失效的问题,包括了解决layer.open后laydate失效的问题的使用技巧和注意事项,需要的朋友参考一下 如果你的open方式是1(html)的话这样是可以的, 如果是2(iframe)方式打开,你把注入的代码写在打开的界面就可以了不用这样写,open的参数type是有区别的,所以请注意: 今天在开发项目时候使用到了laydate,按照官方

  • 本文向大家介绍解决IDEA 2020.3 lombok失效问题,包括了解决IDEA 2020.3 lombok失效问题的使用技巧和注意事项,需要的朋友参考一下 本地安装的是IDEA2020.3 社区版,使用lombok插件失效,编译报错,“You aren‘t using a compiler supported by lombok, so lombok will not work and has