天天看點

第二章 SQL指令參考-LOCK

LOCK

Locks a table.

概要

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

where lockmode is one of:

ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE

| SHARE | SHAREROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

描述

LOCK TABLE擷取一個表級鎖,如果需要釋放任何沖突的鎖,則等待。

如果指定NOWAIT,則LOCK TABLE不等待擷取所需的鎖:如果不能立即擷取該指令,則該指令将中止并發出錯誤。一旦獲得,鎖将保持目前交易的剩餘部分。沒有UNLOCK TABLE指令;鎖總是在交易結束時被釋放。

對于引用表的指令自動擷取鎖定,Greenplum資料庫始終使用限制最小的鎖定模式。 LOCK TABLE提供了可能需要更多限制性鎖定的情況。例如,假設應用程式在Read Committed隔離級别運作事務,并且需要確定表中的資料在事務持續時間内保持穩定。要實作這一點,您可以在que_g之前在表上擷取SHARE鎖定模式。這将防止并發資料更改,并確定表的後續讀取可以看到送出的資料的穩定視圖,因為SHARE鎖定模式與由作者擷取的ROW EXCLUSIVE鎖沖突,并且您的LOCK TABLE名稱IN SHARE MODE語句将等到任何并發持有者的ROW EXCLUSIVE模式鎖送出或復原。是以,一旦你獲得鎖,就沒有沒有送出的寫作;此外,沒有一個可以開始,直到你釋放鎖。

在Serializable隔離級别運作事務時,要實作類似的方法,您必須在執行任何SELECT或資料修改語句之前執行LOCK TABLE語句。可序列化事務的資料視圖将在其第一個sELEcT或資料修改語句開始時被當機。事務稍後的LOCK TABLE仍将阻止并發寫入 - 但是它不會確定事務讀取對應于最近送出的值。

如果此類事務将更改表中的資料,則應使用SHARE ROW EXCLUSIVE鎖定模式而不是SHARE模式。這樣可以確定一次隻運作此類型的一個事務。沒有這種情況,可能會有死鎖:兩個事務可能都會擷取SHARE模式,然後無法擷取ROW EXCLUSIVE模式來實際執行其更新。請注意,一個事務自己的鎖永遠不會沖突,是以一個事務可以在保持SHARE模式時擷取ROW EXCLUSIVE模式,但如果其他人持有SHARE模式,則不能。為了避免死鎖,請確定所有事務以相同的順序擷取同一對象上的鎖,并且如果單個對象涉及多個鎖定模式,則事務應始終首先擷取最嚴格的模式。

parameter

name

要鎖定的現有表的名稱(可選地,模式限定)。

如果給出了多個表,則按照LOCK TABLE指令中指定的順序逐個鎖定表。

lockmode

鎖定模式指定該鎖與之沖突的鎖定。如果沒有指定鎖定模式,則使用最嚴格的通路模式ACCESSEXCLUSIVE。鎖定模式如下:

•    ACCESS SHARE —CCESS SHARE隻與ACCESSEXCLUSIVE鎖定模式發生沖突。SELECT指令和自動分析獲得上引用的表這個模式的鎖。一般情況下,任何隻讀取表不修改,将獲得此種模式的鎖。

•    ROW SHARE —與EXCLUSIVE和ACCESSEXCLUSIVE鎖定模式沖突。 SELECT FOR UPDATE和SELECT FORSHARE指令在目标表上自動擷取此模式的鎖定(除了被引用但未選擇FOR UPDATE /FOR SHARE的任何其他表上的ACCESS SHARE鎖之外)。(inaddition to access share lockson any other tables that are referenced but not selected for update/for share).

•    ROW SHARE —EXCLUSIVE和ACCESSEXCLUSIVE鎖模式會發生沖突.SELECT FOR UPDATE,SELECT FORSHARE指令自動擷取目标表(S)這種模式的鎖。

•    ROW EXCLUSIVE —與SHARE,SHARE ROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE鎖定模式沖突。指令INSERT和COPY在目标表上自動擷取此鎖定模式(除了任何其他引用的表上的ACCESS SHARE鎖)。

•    SHARE UPDATE EXCLUSIVE —和SHAREUPDATEEXCLUSIVE,SHARE,SHARE ROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE模式沖突。此模式保護表免受并發模式更改和VACUUM運作。由VACUUM自動擷取(無FULL)。這個模式防止并發模式改變和VACUUM運作的表。由VACUUM自動擷取(沒有FULL)

•    SHARE —與ROW EXCLUSIVE,SHARE UPDATEEXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE鎖定模式沖突。此模式保護表免受并發資料更改。由CREATE INDEX自動擷取。

•  SHAREROW EXCLUSIVE —與ROW EXCLUSIVE,SHARE UPDATEEXCLUSIVE,SHARE,SHARE ROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE鎖定模式的沖突。 任何GreenplumDatabase指令都不會自動擷取此鎖定模式。

•    EXCLUSIVE —與ROW SHARE,ROW EXCLUSIVE,SHARE UPDATEEXCLUSIVE,SHARE,SHARE ROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE鎖定模式的沖突。 此模式僅允許并發的ACCESS SHARE鎖,即隻有從表中讀取可以與持有該鎖定模式的事務并行進行。 Greenplum資料庫中的UPDATE和DELETE自動擷取此鎖定模式(與正常PostgreSQL相比,鎖定更為限制)。

•    ACCESS EXCLUSIVE —與所有模式的鎖的沖突(ACCESS SHARE,ROW SHARE,ROW EXCLUSIVE,SHARE UPDATEEXCLUSIVE,SHARE,SHAREROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE)。 此模式保證持有人是以任何方式通路表的唯一事務。 由ALTER TABLE,DROP TABLE,REINDEX,CLUSTER和VACUUM FULL指令自動擷取。 這也是不明确指定模式的LOCK TABLE語句的預設鎖定模式。

NOWAIT

指定LOCK TABLE不應等待任何沖突的鎖釋放:如果在不等待的情況下無法立即擷取指定的鎖,則會中止該事務。

Notes

通路分享模式中的鎖定表需要目标表上的SELECT權限。所有其他形式的LOCK需要UPDATE和/或DELETE權限。

LOCK TABLE僅在事務塊(BEGIN / COMMIT對)内有用,因為一旦事務結束,鎖就被丢棄。出現在任何事務塊之外的LOCK TABLE指令形成一個自包含的事務,是以鎖将在擷取後立即被丢棄。

LOCK TABLE僅處理表級鎖,是以涉及ROW的模式名稱都是錯誤的。這些模式名稱通常應該被讀取為訓示使用者擷取鎖定表中的行級鎖的意圖。另外,ROW EXCLUSIVE模式是一個可共享的表鎖。請記住,所有鎖定模式對于LOCK TABLE而言都具有相同的語義,僅在與哪些模式沖突的規則中有所不同。有關如何擷取實際行級鎖的資訊,請參閱SELECT參考文檔中的FOR UPDATE / FOR SHARE子句。

示例

Obtain a SHARE lock on the films table when going to perform inserts into the films_user_comments

table:

BEGINWORK;

LOCKTABLE films IN SHARE MODE;

SELECTid FROM films

WHEREname = 'Star Wars: Episode I - The Phantom Menace';

-- DoROLLBACK if record was not returned

INSERTINTO films_user_comments VALUES

(_id_,'GREAT! I was waiting for it for so long!');

COMMITWORK;

Take a SHARE ROW EXCLUSIVE lock on a table when performing a deleteoperation:

BEGINWORK;

LOCKTABLE films IN SHARE ROW EXCLUSIVE MODE;

DELETEFROM films_user_comments WHERE id IN

(SELECTid FROM films WHERE rating < 5);

DELETEFROM films WHERE rating < 5;

COMMITWORK;

相容性

SQL标準中沒有LOCK TABLE,而是使用SETTRANSACTION來指定事務的并發級别。 Greenplum資料庫也支援。

除了ACCESS SHARE,ACCESSEXCLUSIVE和SHARE UPDATE EXCLUSIVE鎖定模式外,Greenplum資料庫鎖定模式和LOCK TABLE文法與Oracle中存在的一樣。

相關參考

BEGIN, SET TRANSACTION, SELECT