幾天前我們說明了什麼是隔離級別以及為什麼我們要使用它,這都是因為要解決並行交易
所產生的問題,今天我們一樣來探討在 PostgreSQL 中什麼是 鎖定模式 (Lock Modes)
在資料庫中,當多個交易(Transaction)同時操作(CRUD)同一資料時,為了保護數據完整性和避免可能的衝突,系統會使用鎖定機制
PostgreSQL 提供了多種不同的鎖定模式,以便在不同的情境中協調多個交易的活動
PostgreSQL 中鎖定模式主要分為兩大類
其中這兩大類的鎖定模式,底下又有許多的鎖定模式
今天我們就先來了解什麼是 Row-Level Locks (行鎖定)
考慮一個情境,兩個交易同時試圖修改同一行的資料。如果沒有鎖定機制,兩個交易可能會互相干擾,導致數據不一致或其他未預期的結果。行鎖定允許系統序列化對特定行的訪問,確保在給定時間只有一個交易可以修改它
FOR UPDATE
案例:假設你正在運行一個銀行應用程式,用戶想要提款。為了確保在提款期間帳戶的餘額不被其他交易修改,你可能會這麼做:
BEGIN;
SELECT * FROM accounts WHERE account_id = 123 FOR UPDATE;
-- 提款操作
COMMIT;
說明:FOR UPDATE
鎖定選定的行,以防止其他交易對其進行修改或刪除操作,直到當前交易提交。
FOR NO KEY UPDATE
案例:假設你正在運行一個庫存管理系統。你想要修改一個產品的描述,但不想在此期間阻止其他交易修改該產品的價格或其他非鍵列:
BEGIN;
SELECT * FROM products WHERE product_id = 456 FOR NO KEY UPDATE;
-- 修改產品描述
COMMIT;
說明:FOR NO KEY UPDATE
鎖定選定的行,但允許其他交易修改非鍵列,也就是不能修改主鍵、唯一鍵和外部鍵
FOR SHARE
案例:假設你想查看某個學生的成績,而不想在此期間讓其他交易修改或刪除該學生的資料,但允許其他交易也查看:
BEGIN;
SELECT * FROM students WHERE student_id = 789 FOR SHARE;
-- 查看成績
COMMIT;
說明:FOR SHARE
鎖定選定的行,以防止其他交易修改或刪除它,但允許其他交易也使用 FOR SHARE
鎖定同一行。
FOR KEY SHARE
案例:假設你正在運行一個書店管理系統,你想查看一本書的詳細資訊,同時允許其他交易修改該書的非鍵列,如描述或價格:
BEGIN;
SELECT * FROM books WHERE book_id = 101 FOR KEY SHARE;
-- 查看書的詳細資訊
COMMIT;
說明:FOR KEY SHARE
鎖定選定的行,但允許其他交易修改其非鍵列。這會阻止其他交易使用 FOR NO KEY UPDATE
或 FOR UPDATE
鎖定相同的行
這些鎖定模式通常用於確保資料的完整性和一致性,尤其是在多個交易可能同時訪問相同資料的情況下。選擇適當的鎖定模式取決於具體的應用需求和期望的並發性能