小編給大家分享一下postgresql鎖表的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)專注于中大型企業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè)和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶上千余家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!
表鎖
LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ]
lockmode包括以下幾種:
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
LOCK TABLE命令用于獲取一個(gè)表鎖,獲取過程將阻塞一直到等待的鎖被其他事務(wù)釋放。如果使用NOWAIT關(guān)鍵字則如果獲取不到鎖,將
不會(huì)等待而是直接返回,放棄執(zhí)行當(dāng)前指令并拋出一個(gè)錯(cuò)誤(error)。一旦獲取到鎖,將一直持有鎖直到事務(wù)結(jié)束。(沒有主動(dòng)釋放鎖的命
令,鎖總是會(huì)在事務(wù)結(jié)束的時(shí)候被釋放)。
當(dāng)使用自動(dòng)獲取鎖的模式的時(shí)候,PostgreSQL總是盡可能地使用限制最小的模式。LOCK TABLE命令使我們可以自己定義鎖的限制大
小。比如一個(gè)應(yīng)用程序使用事務(wù)在讀提交(Read Committed isolation level)模式下需要保證數(shù)據(jù)庫的數(shù)據(jù)在事務(wù)期間保持穩(wěn)定,于是可
以使用SHARE鎖模式在讀取前對(duì)表進(jìn)行加鎖。這可以防止并發(fā)的數(shù)據(jù)改變并且可以保證后續(xù)的事務(wù)對(duì)這個(gè)表的讀取不會(huì)讀到?jīng)]有提交的數(shù)
據(jù),因?yàn)镾HARE鎖和由寫入事務(wù)持有的ROW EXCLUSIVE鎖是沖突的,所以對(duì)于想要使用SHARE鎖對(duì)表進(jìn)行加鎖的事務(wù),將會(huì)等到它之
前所有持有該表的ROW EXCLUSIVE鎖的事務(wù)commit或者是roll back。因此,一旦獲取了表的SHARE鎖,將不會(huì)有沒有提交的數(shù)據(jù),同
樣也不會(huì)有其他事務(wù)能夠?qū)Ρ頂?shù)據(jù)進(jìn)行改變,直到當(dāng)前事務(wù)釋放SHARE鎖。
為了在REPEATABLE READ(重復(fù)讀)模式和SERIALIZABLE(序列化)模式下實(shí)現(xiàn)同樣的效果,必須在任何查詢和修改語句之前加上LOCK
TABLE。在執(zhí)行第一句SELECT語句或者修改數(shù)據(jù)語句前,重復(fù)讀和序列化模式中一個(gè)事務(wù)的的數(shù)據(jù)視圖將會(huì)被存儲(chǔ)為快照。在這種情況
下,事務(wù)申明的表鎖同樣可以避免并發(fā)的修改,但是并不能保證該事務(wù)能夠讀取到最新提交的數(shù)據(jù)。
如果一個(gè)事務(wù)想要修改表中的數(shù)據(jù),應(yīng)該使用SHARE ROW EXCLUSIVE(共享行排他)鎖而不是SHARE鎖。共享行排他鎖將能夠保證在同
一時(shí)間只有當(dāng)前事務(wù)能夠運(yùn)行。不加這個(gè)鎖的話可能會(huì)造成死鎖:兩個(gè)事務(wù)同時(shí)想要獲取SHARE鎖,并且接下來又想要同時(shí)獲取ROW
EXCLUSIVE鎖去進(jìn)行數(shù)據(jù)更新(注意:同一個(gè)事務(wù)獲取的兩種不同的鎖不會(huì)造成沖突,所以對(duì)于同一個(gè)事務(wù),它可以在獲取SHARE鎖之后
再次獲取ROW EXCLUSIVE,當(dāng)然是在沒有其他事務(wù)獲取SHARE鎖的情況下)。為了避免死鎖,應(yīng)該保證所有的事務(wù)獲取同一對(duì)象的鎖的
順序是一致的,同時(shí)如果在同一個(gè)對(duì)象上想要獲取多個(gè)鎖,則總是應(yīng)該先獲取限制最大的鎖。
ACCESS SHARE(訪問共享鎖)
只與ACCESS EXCLUSIVE鎖沖突。
SELECT命令會(huì)在當(dāng)前查詢的表上獲取一個(gè)ACCESS SHARE鎖??偟膩碚f,任何只讀操作都會(huì)獲取該鎖。
ROW SHARE(行共享鎖)
和EXCLUSIVE鎖和ACCESS EXCLUSIVE鎖沖突。
SELECT FOR UPDATE或者SELECT FOR SHARE命令會(huì)在目標(biāo)表上獲取該鎖,并且所有被引用但是沒有FOR UPDATE的表上會(huì)加上ACCESS SHARED鎖。
ROW EXCLUSIVE(行排他鎖)
和SHARE,SHARE ROW EXCLUSIVE和ACCESS EXCLUSIVE鎖沖突。
UPDATE,DELETE和INSERT會(huì)在目標(biāo)表上獲取該鎖,總的來說,任何對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行修改的命令會(huì)獲取到該鎖。
SHARE UPDATE EXCLUSIVE(共享更新排他鎖)
和SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE沖突,該鎖可以保護(hù)表防止并發(fā)的
(schema)改變和VACUUM(釋放空間)命令。
VACUUM,ANALYZE,CREATE INDEX CONCURRENTLY和ALTER TABLE VALIDATE以及其他ALTER TABLE類的命令會(huì)獲取該鎖。
SHARE(共享鎖)
和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE鎖沖突。該鎖保護(hù)
一個(gè)表防止并發(fā)的數(shù)據(jù)改變。
由CREATE INDEX命令獲得。
SHARE ROW EXCLUSIVE(行共享排他鎖)
和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE以及ACCESS EXCLUSIVE鎖沖
突,該鎖用于保護(hù)一個(gè)表防止并發(fā)的數(shù)據(jù)改變,同時(shí)是自排他的,所以在同一時(shí)間只有同一個(gè)session可以持有該鎖。
該鎖不會(huì)被PGSQL的任何命令自動(dòng)獲取。
EXCLUSIVE(排它鎖)
和ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS
EXCLUSIVE鎖沖突。該鎖只允許并發(fā)的ACCESS SHARE鎖,只有只讀操作能在一個(gè)事務(wù)持有排他鎖的時(shí)候進(jìn)行并發(fā)操作。
ACCESS EXCLUSIVE(訪問排他鎖)
和所有的鎖都沖突,該鎖保證只有持有鎖的事務(wù)能夠訪問當(dāng)前表。
被DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL和REFRESH MATERIALIZED VIEW命令自動(dòng)獲取。有很多種形
式的ALTER TABLE命令可以獲取該鎖,它同樣也是LOCK TABLE命令默認(rèn)的鎖級(jí)別。
只有ACCESS EXCLUSIVE鎖可以防止一個(gè)SELECT語句。
注意
一段獲取鎖,只有當(dāng)事務(wù)結(jié)束的時(shí)候才會(huì)釋放,但是如果一個(gè)鎖是在一個(gè)savepoint(保存點(diǎn))之后被獲取,則當(dāng)這個(gè)保存點(diǎn)回滾的時(shí)候這個(gè)鎖會(huì)被馬上釋放。
看完了這篇文章,相信你對(duì)postgresql鎖表的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!