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 協議》,轉載必須註明作者和本文連結