laravel樂觀鎖和悲觀鎖

huaweichenai發表於2023-02-15

一:樂觀鎖

在laravel中樂觀鎖大多是基於資料版本 ( Version )記錄機制實現。何謂資料版本?即為資料增加一個版本標識,在基於資料庫表的版本解決方案中,一般是透過為資料庫表增加一個 “version” 欄位來實現。

讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。

二:悲觀鎖

在laravel中查詢構造器包含一些可以幫助你在 select 語法上實現「悲觀鎖定」的函式。若想在查詢中實現一個「共享鎖」, 你可以使用 sharedLock 方法。 共享鎖可防止選中的資料列被篡改,直到事務被提交為止 :

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

上面這個查詢等價於下面這條 SQL 語句:

select * from `users` where `votes` > '100' lock in share mode;

此外你還可以使用 lockForUpdate 方法。“for update”鎖避免選擇行被其它共享鎖修改或刪除:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

上面這個查詢等價於下面這條 SQL 語句:

select * from `users` where `votes` > '100' for update;

相關文章