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

參考資料

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

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

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

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

購書連結

購書連結

results matching ""

    No results matching ""