天天看點

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()事務失效問題就是小編分享給大家的全部内容了,希望能給大家一個參考。