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