iT邦幫忙

2023 iThome 鐵人賽

DAY 21
1
自我挑戰組

Hello SQL 初次見面你好系列 第 21

Day 21: PostgreSQL 中的 Row-Level Locks (行鎖定)

  • 分享至 

  • xImage
  •  

幾天前我們說明了什麼是隔離級別以及為什麼我們要使用它,這都是因為要解決並行交易所產生的問題,今天我們一樣來探討在 PostgreSQL 中什麼是 鎖定模式 (Lock Modes)

什麼是鎖定模式 (Lock Modes)?

在資料庫中,當多個交易(Transaction)同時操作(CRUD)同一資料時,為了保護數據完整性和避免可能的衝突,系統會使用鎖定機制
PostgreSQL 提供了多種不同的鎖定模式,以便在不同的情境中協調多個交易的活動

PostgreSQL 中鎖定模式主要分為兩大類

  1. Table-Level Locks (表鎖定)
  2. Row-Level Locks (行鎖定)

其中這兩大類的鎖定模式,底下又有許多的鎖定模式

今天我們就先來了解什麼是 Row-Level Locks (行鎖定)

為什麼需要行鎖定?

考慮一個情境,兩個交易同時試圖修改同一行的資料。如果沒有鎖定機制,兩個交易可能會互相干擾,導致數據不一致或其他未預期的結果。行鎖定允許系統序列化對特定行的訪問,確保在給定時間只有一個交易可以修改它

PostgreSQL 中的行鎖定模式 (Row-Level Locks Modes)

  1. FOR UPDATE
    案例:假設你正在運行一個銀行應用程式,用戶想要提款。為了確保在提款期間帳戶的餘額不被其他交易修改,你可能會這麼做:

    BEGIN;
    SELECT * FROM accounts WHERE account_id = 123 FOR UPDATE;
    -- 提款操作
    COMMIT;
    

    說明FOR UPDATE 鎖定選定的行,以防止其他交易對其進行修改或刪除操作,直到當前交易提交。

  2. FOR NO KEY UPDATE
    案例:假設你正在運行一個庫存管理系統。你想要修改一個產品的描述,但不想在此期間阻止其他交易修改該產品的價格或其他非鍵列:

    BEGIN;
    SELECT * FROM products WHERE product_id = 456 FOR NO KEY UPDATE;
    -- 修改產品描述
    COMMIT;
    

    說明FOR NO KEY UPDATE 鎖定選定的行,但允許其他交易修改非鍵列,也就是不能修改主鍵、唯一鍵和外部鍵

  3. FOR SHARE
    案例:假設你想查看某個學生的成績,而不想在此期間讓其他交易修改或刪除該學生的資料,但允許其他交易也查看:

    BEGIN;
    SELECT * FROM students WHERE student_id = 789 FOR SHARE;
    -- 查看成績
    COMMIT;
    

    說明FOR SHARE 鎖定選定的行,以防止其他交易修改或刪除它,但允許其他交易也使用 FOR SHARE 鎖定同一行。

  4. FOR KEY SHARE
    案例:假設你正在運行一個書店管理系統,你想查看一本書的詳細資訊,同時允許其他交易修改該書的非鍵列,如描述或價格:

    BEGIN;
    SELECT * FROM books WHERE book_id = 101 FOR KEY SHARE;
    -- 查看書的詳細資訊
    COMMIT;
    

    說明FOR KEY SHARE 鎖定選定的行,但允許其他交易修改其非鍵列。這會阻止其他交易使用 FOR NO KEY UPDATEFOR UPDATE 鎖定相同的行

這些鎖定模式通常用於確保資料的完整性和一致性,尤其是在多個交易可能同時訪問相同資料的情況下。選擇適當的鎖定模式取決於具體的應用需求和期望的並發性能


上一篇
Day 20: 實時監控和日誌
下一篇
Day 22: PostgreSQL 中的 Table-Level Locks (表級鎖定)
系列文
Hello SQL 初次見面你好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言