鎖定資料 Lock
鎖定資料有 shared lock (sharedLock)
與 lock for update (lockForUpdate)
,兩者都可以避面同一行資料被其他的 transaction update
在 Laravel 鎖定資料庫資料
範例
sharedLock
DB::table('users')
->where('votes', '>', 100)
->sharedLock()
->get();
select * from `users`
where `votes` > '100' lock in share mode
DB::table('tasks')
->select('details', 'created_at')
->whereDate('created_at', '=', '2011-11-11')
->sharedLock()
->get();
select `details`, `created_at` from `tasks`
where date(`created_at`) = '2011-11-11' lock in share mode
可以使用 ->sharedLock()
或 ->lock(false)
去做 sharedLock
lockForUpdate
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
select * from `users`
where `votes` > '100' for update
DB::table('tasks')
->select('details', 'created_at')
->whereDate('created_at', '>', '2016-11-24')
->lockForUpdate()
->get();
select `details`, `created_at` from `tasks`
where date(`created_at`) = '2016-11-24' for update
可以使用 ->lockForUpdate()
或 ->lock(true)
去做 lockForUpdate
不同的地方
定義
sharedLock locks only for write, lockForUpdate also prevents them from being selected
shared lock (sharedLock)
與 lock for update (lockForUpdate)
兩者都是鎖定類型的 transaction,但這兩個鎖定類型的 transaction 不會避免非鎖定的 transaction 去讀取到資料。
sharedLock
其他的 Session 可以 Select,但無法 Update 資料
如果 Session_1 使用 sharedLock 去讀取資料並對資料進行修改,而 Session_2 也使用 sharedLock 去讀取資料並對資料進行修改,則 Session_2 會等到 Session_1 commit 之後,才能對資料進行 update,若 Session_1 與 Session_2 都有修改到同樣欄位資料,則會變成最後修改的 Session_2 的資料。
使用情境
有 parent
及 child
兩個資料表,而兩者資料是有關聯性的,當要新增資料至 child
資料表時,必須確保 parent
資料表有資料,才不會讓 child
找不到他的 parent
,此時可以使用 sharedLock 去避免資料被異動(刪除、更新)
SELECT * FROM parent WHERE NAME = 'Jones' FOR SHARE;
lockForUpdate
可以避免被其他鎖定型 transaction 進行 Select
當需要對同一欄位確保資料 update 是正確的,如計數器,則必須使用 lockForUpdate 來鎖定資料
當 parent
內有一個計數器欄位紀錄總共有多少 child
,則為了數字正確更新,必須避免其他鎖定型的 transaction 進行資料異動
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;
參考資料
- Database: Query Builder - Laravel - The PHP Framework For Web Artisans
- Laravel 5: Query Builder Helpers – locks – Jeff's Reference
- Pessimistic Locking in Laravel 5
- 使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁 - Laravel - 大象笔记
- MySQL :: MySQL 8.0 Reference Manual :: 15.5.2.4 Locking Reads
- transactions - MySQL InnoDB: Difference Between
FOR UPDATE
andLOCK IN SHARE MODE
- Stack Overflow - MySQL InnoDB Transaction – 交易指南 (SELECT … FOR UPDATE) – YIDAS Code
- Pessimistic vs Optimistic Locking in Laravel – Ali AslRousta – Medium
KeJyun 最新新書推薦
|
|
---|---|
Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。 雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。 本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。 |
|
購書連結 |
|
購書連結 |