PostgreSQL - 鎖



排他鎖寫鎖阻止使用者修改一行或整個表。UPDATE 和 DELETE 修改的行會自動被排它鎖定,持續整個事務期間。這防止其他使用者在事務提交或回滾之前更改該行。

使用者必須等待其他使用者的情況只發生在他們嘗試修改同一行時。如果他們修改不同的行,則無需等待。SELECT 查詢永遠不需要等待。

資料庫自動執行鎖定。但是,在某些情況下,必須手動控制鎖定。可以使用 LOCK 命令進行手動鎖定。它允許指定事務的鎖型別和範圍。

LOCK 命令的語法

LOCK 命令的基本語法如下:

LOCK [ TABLE ]
name
 IN
lock_mode
  • 名稱 - 要鎖定的現有表的名稱(可選的模式限定)。如果在表名前指定 ONLY,則只鎖定該表。如果沒有指定 ONLY,則鎖定該表及其所有子表(如有)。

  • 鎖模式 - 鎖模式指定此鎖與哪些鎖衝突。如果沒有指定鎖模式,則使用 ACCESS EXCLUSIVE(最嚴格的模式)。可能的值為:ACCESS SHARE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、ACCESS EXCLUSIVE。

獲得鎖後,將在當前事務的剩餘時間內保持該鎖。沒有 UNLOCK TABLE 命令;鎖總是在事務結束時釋放。

死鎖

當兩個事務都在等待對方完成其操作時,可能會發生死鎖。雖然 PostgreSQL 可以檢測到死鎖並透過 ROLLBACK 結束它們,但死鎖仍然可能帶來不便。為了防止應用程式遇到此問題,請確保以這樣的方式設計它們:它們將按相同順序鎖定物件。

建議鎖

PostgreSQL 提供了建立具有應用程式定義含義的鎖的方法。這些稱為建議鎖。由於系統不強制執行其使用,因此應用程式有責任正確使用它們。建議鎖對於 MVCC 模型不合適的鎖定策略非常有用。

例如,建議鎖的常見用途是模擬所謂的“平面檔案”資料管理系統中典型的悲觀鎖定策略。雖然儲存在表中的標誌可以用於相同目的,但建議鎖更快,避免表膨脹,並且會在會話結束時由伺服器自動清理。

示例

考慮表 COMPANY,其記錄如下:

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

以下示例在 ACCESS EXCLUSIVE 模式下鎖定 testdb 資料庫中的 COMPANY 表。LOCK 語句僅在事務模式下有效:

testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

上述 PostgreSQL 語句將產生以下結果:

LOCK TABLE

上述訊息指示該表已鎖定,直到事務結束,要結束事務,您必須回滾或提交事務。

廣告
© . All rights reserved.