当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-14 15:19:59 浏览: 评论:0 

今天小编就为大家分享一篇laravel 解决多库下的DB::transaction()事务失效问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

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

  1. DB::transaction(function () use ($uid$roleId) { 
  2.  RoomUserRole::insert([ 
  3.   'uid' => $uid
  4.   'role_id' => $roleId
  5.   'created_at' => LARAVEL_START, 
  6.   'updated_at' => LARAVEL_START 
  7.  ]); 
  8.  
  9.  RoomUserRoleLog::insert([ 
  10.   'uid' => $uid
  11.   'handle_type' => 1, 
  12.   'admin_uid' => Auth::user()->id, 
  13.   'created_at' => LARAVEL_START, 
  14.   'updated_at' => LARAVEL_START 
  15.  ]); 
  16.  
  17. }); 

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

原因以及解决方法:

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

  1. DB::connection('mysql2')->transaction(function () use ($uid$roleId) { 
  2.  RoomUserRole::insert([ 
  3.   'uid' => $uid
  4.   'role_id' => $roleId
  5.   'created_at' => LARAVEL_START, 
  6.   'updated_at' => LARAVEL_START 
  7.  ]); 
  8.  
  9.  RoomUserRoleLog::insert([ 
  10.   'uid' => $uid
  11.   'handle_type' => 1, 
  12.   'admin_uid' => Auth::user()->id, 
  13.   'created_at' => LARAVEL_START, 
  14.   'updated_at' => LARAVEL_START 
  15.  ]); 
  16.  
  17. }); // 这样你会发现事务才正常回滚 

同样

DB::connection('mysql_chat_room')->beginTransaction();

DB::connection('mysql_chat_room')->commit();

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

Tags: laravel DB::transaction()

分享到: