表級鎖模式 |
解釋 |
ACCESS SHARE |
只與“ACCESS EXCLUSIVE” 鎖模式?jīng)_突; |
查詢命令(Select command)將會在它查詢的表上獲取”Access Shared” 鎖,一般地,任何一個對表上的只讀查詢操作都將獲取這種類型的鎖。 |
|
ROW SHARE |
與”Exclusive'和”Access Exclusive”鎖模式?jīng)_突; |
”Select for update”和”Select for share”命令將獲得這種類型鎖,并且所有被引用但沒有 FOR UPDATE 的表上會加上”Access shared locks”鎖。 |
|
ROW EXCLUSIVE |
與 “Share,Shared roexclusive,Exclusive,Access exclusive”模式?jīng)_突; |
“Update,Delete,Insert”命令會在目標表上獲得這種類型的鎖,并且在其它被引用的表上加上”Access shared”鎖,一般地,更改表數(shù)據(jù)的命令都將在這張表上獲得”Row exclusive”鎖。 |
|
SHARE UPDATE EXCLUSIVE |
”Share update exclusive,Share,Share row ,exclusive,exclusive,Access exclusive”模式?jīng)_突,這種模式保護一張表不被并發(fā)的模式更改和VACUUM; |
“Vacuum(without full), Analyze ”和 “Create index concurrently”命令會獲得這種類型鎖。 |
|
SHARE |
與“Row exclusive,Shared update exclusive,Share row exclusive ,Exclusive,Access exclusive”鎖模式?jīng)_突,這種模式保護一張表數(shù)據(jù)不被并發(fā)的更改; |
“Create index”命令會獲得這種鎖模式。 |
|
SHARE ROW EXCLUSIVE |
與“Row exclusive,Share update exclusive,Shared,Shared row exclusive,Exclusive,Access Exclusive”鎖模式?jīng)_突; |
任何Postgresql 命令不會自動獲得這種鎖。 |
|
EXCLUSIVE |
與” ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE”模式?jīng)_突,這種索模式僅能與Access Share 模式并發(fā),換句話說,只有讀操作可以和持有”EXCLUSIVE”鎖的事務并行; |
任何Postgresql 命令不會自動獲得這種類型的鎖; |
|
ACCESS EXCLUSIVE |
與所有模式鎖沖突(ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, and ACCESS EXCLUSIVE),這種模式保證了當前只有一個事務訪問這張表;“ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER, VACUUM FULL” 命令會獲得這種類型鎖,在Lock table 命令中,如果沒有申明其它模式,它也是缺省模式。 |
Requested Lock Mode |
Current Lock Mode |
|||||||
ACCESS SHARE |
ROW SHARE |
ROW EXCLUSIVE |
SHARE UPDATE EXCLUSIVE |
SHARE |
SHARE ROW EXCLUSIVE |
EXCLUSIVE |
ACCESS EXCLUSIVE |
|
ACCESS SHARE |
X |
X |
||||||
ROW SHARE |
X |
X |
||||||
ROW EXCLUSIVE |
X |
X |
X |
X |
||||
SHARE UPDATE EXCLUSIVE |
X |
X |
X |
X |
X |
|||
SHARE |
X |
X |
X |
X |
X |
|||
SHARE ROW EXCLUSIVE |
X |
X |
X |
X |
X |
X |
||
EXCLUSIVE |
X |
X |
X |
X |
X |
X |
X |
|
ACCESS EXCLUSIVE |
X |
X |
X |
X |
X |
X |
X |
X |
鎖類型 |
對應的數(shù)據(jù)庫操作 |
ACCESS SHARE |
select |
ROW SHARE |
select for update, select for share |
ROW EXCLUSIVE |
update,delete,insert |
SHARE UPDATE EXCLUSIVE |
vacuum(without full),analyze,create index concurrently |
SHARE |
create index |
SHARE ROW EXCLUSIVE |
任何Postgresql命令不會自動獲得這種鎖 |
EXCLUSIVE |
任何Postgresql命令不會自動獲得這種類型的鎖 |
ACCESS EXCLUSIVE |
alter table,drop table,truncate,reindex,cluster,vacuum full |
testdb=# \h lock Command: LOCK Description: lock a table Syntax: LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ] where lockmode is one of: ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
注:
name:要鎖定的現(xiàn)有表的鎖名稱(可選模式限定)。 如果在表名之前指定了ONLY,則僅該表被鎖定 如果未指定ONLY,則表及其所有后代表(如果有)被鎖定。
lock_mode:鎖模式指定此鎖與之沖突的鎖。 如果未指定鎖定模式,則使用最嚴格的訪問模式ACCESS EXCLUSIVE。
當事務要更新表中的數(shù)據(jù)時,應該申請“ROW EXCLUSIVER”
只有兩種,共享鎖和排他鎖,或者可以說是“讀鎖” 或 “寫鎖“
由于多版本的實現(xiàn),實際讀取行數(shù)據(jù)時,并不會在行上執(zhí)行任何鎖
SELECT …… FOR { UPDATE | SHARE } [OF table_name[,……]] [ NOWAIT]
備注:
1)指定 OF table_name,則只有被指定的表會被鎖定
2)例外情況,主查詢中引用了WITH查詢時,WITH查詢中的表不被鎖定
3)如果需要鎖定WITH查詢中的表,需在WITH查詢內指定FOR UPDATA或FOR SHARE
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。