鎖定資料 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 的資料。

使用情境

parentchild 兩個資料表,而兩者資料是有關聯性的,當要新增資料至 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;

參考資料

KeJyun 最新新書推薦
- Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
- Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站

購書連結

Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

購書連結

comments powered by Disqus