全部產品
Search
文件中心

PolarDB:LOCK

更新時間:Jul 06, 2024

鎖定表。

文法

LOCK TABLE name [, ...] IN lockmode MODE [ NOWAIT ]

其中,lockmode是以下項之一:

ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE

說明

LOCK TABLE 可獲得表層級的鎖定,必要時等待釋放所有衝突的鎖定。如果指定 NOWAIT,則 LOCK TABLE 不會等待實現需要的鎖定:如果不能立即獲得鎖定,該命令會被中止且報告錯誤。在獲得鎖定後,會在當前事務的剩餘時間內保持鎖定。(不存在 UNLOCK TABLE 命令;在事務結束時始終釋放鎖定。)

在為參考資料表的命令自動實現鎖定時,PolarDB PostgreSQL版(相容Oracle)始終使用限制最少的鎖定模式。提供 LOCK TABLE 以用於您可能需要限制更多的鎖定的情況。例如,假設應用程式在隔離等級 Read Committed 運行事務,並需要確保在事務期間表中的資料保持穩定。為實現該目的,可以在查詢之前獲得表的 SHARE 鎖定模式。這樣可防止並發資料更改,並確保後續讀取表時會看到已提交資料的穩定視圖,因為 SHARE 鎖定模式與寫入者獲得的 ROWEXCLUSIVE 鎖定衝突,而您的 LOCKTABLE name IN SHARE MODE語句將等待 ROW EXCLUSIVE 模式的所有並發持有人鎖定提交或復原。因此,一旦您獲得鎖定,將不存在未完成的未提交寫入;另外,在您釋放鎖定之前,沒有使用者可以開始操作。

當在隔離等級 serializable 運行事務時,要實現相似效果,您必須先執行 LOCK TABLE 語句,然後再執行任何資料修改語句。在可序列化的事務的第一個資料修改語句開始時,該事務的資料檢視會被凍結。稍後的 LOCK TABLE 將仍然禁止並發寫入 - 但不確保事務讀取的值與最新提交值對應。

如果此類事務要更改表中的資料,則它應使用 SHARE ROW EXCLUSIVE 鎖定模式代替 SHARE 模式。

由此可確保一次僅運行一個此類事務。否則,可能會發生死結:兩個事務可能都獲得 SHARE 模式,然後無法同時擷取 ROWEXCLUSIVE 模式以真正執行它們的更新。(請注意,事務自身的鎖定不會衝突,因此事務可在保持 SHARE 模式時擷取 ROWEXCLUSIVE 模式,但如果其他使用者保持 SHARE 模式,則無法擷取。)為避免死結,請確保所有事務按相同順序擷取對相同對象的鎖定,而且如果單個對象涉及多個鎖定模式,則事務應始終首先擷取限制最多的模式。

參數

參數名稱
name要鎖定的現有表的名稱(可能是 schema 限定的)。

命令 LOCKTABLE a, b; 等同於 LOCK TABLE a; LOCK TABLE b。表會按照在 LOCK TABLE 命令中指定的順序依次鎖定。

lockmode鎖定模式會指定該鎖定與哪些鎖定衝突。

如果未指定鎖定模式,則伺服器使用限制最多的 ACCESS EXCLUSIVE 模式。(ACCESS EXCLUSIVE 與 Oracle 資料庫不相容。在PolarDB PostgreSQL版(相容Oracle)中,該配置模式確保其他事務不可對鎖定的表進行任何形式的訪問。)

NOWAIT指定 LOCKTABLE 不等待釋放任何衝突的鎖定:如果不能無需等待就立即擷取指定的鎖定,則事務中止。

注釋

LOCK 的所有形式均需要 UPDATE 和/或 DELETE 特權。

LOCK TABLE 僅在事務塊內有用,因為在事務結束後會立即刪除鎖定。在任何事務塊以外顯示的 LOCK TABLE 命令組成自包含的事務,所以會在擷取鎖定後立即將其刪除。

LOCK TABLE 僅處理表層級的鎖定,所以有關 ROW 的所有模式名稱都不準確。通常,讀取這些模式名稱時應指示使用者的意圖,即在鎖定表內擷取行層級的鎖定。另外,ROW EXCLUSIVE 模式是可共用的表鎖定。請記住,所有鎖定模式都具有與 LOCK TABLE 相關的相同含義,只是關於相互衝突的模式的規則有所不同。