關於 Laravel 資料庫查詢鎖必須要知道的知識點

h6play發表於2020-02-23

Mysql鎖的型別

1 共享鎖
* 查詢資料 會阻塞 等待沒有任何人佔用的時候再返回
* 更新資料 會阻塞 等待沒有任何人佔用的時候再返回

DB::table('users')->where('id', 100)->lockForUpdate()->first();

2 悲觀鎖
* 查詢資料 正常查詢返回
* 更新資料 會阻塞 等待上一個鎖更新執行完畢後再更新

DB::table('users')->where('id', 100)->sharedLock()->first();

如果我直接使用鎖不使用事務能正常邏輯嗎?

  • 正確
    DB::transaction(function() {
      $user = DB::table('users')->where('id', 100)->lockForUpdate()->first();
      $user->nick_name = "老王";
      $user->save();
    });
  • 錯誤
    $user = DB::table('users')->where('id', 100)->lockForUpdate()->first();
    $user->nick_name = "老王";
    $user->save();
  • 原因 鎖必須要在事務中進行才能生效
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章