您好,登錄后才能下訂單哦!
小編給大家分享一下postgresql鎖表的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
表鎖
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命令用于獲取一個表鎖,獲取過程將阻塞一直到等待的鎖被其他事務釋放。如果使用NOWAIT關鍵字則如果獲取不到鎖,將
不會等待而是直接返回,放棄執行當前指令并拋出一個錯誤(error)。一旦獲取到鎖,將一直持有鎖直到事務結束。(沒有主動釋放鎖的命
令,鎖總是會在事務結束的時候被釋放)。
當使用自動獲取鎖的模式的時候,PostgreSQL總是盡可能地使用限制最小的模式。LOCK TABLE命令使我們可以自己定義鎖的限制大
小。比如一個應用程序使用事務在讀提交(Read Committed isolation level)模式下需要保證數據庫的數據在事務期間保持穩定,于是可
以使用SHARE鎖模式在讀取前對表進行加鎖。這可以防止并發的數據改變并且可以保證后續的事務對這個表的讀取不會讀到沒有提交的數
據,因為SHARE鎖和由寫入事務持有的ROW EXCLUSIVE鎖是沖突的,所以對于想要使用SHARE鎖對表進行加鎖的事務,將會等到它之
前所有持有該表的ROW EXCLUSIVE鎖的事務commit或者是roll back。因此,一旦獲取了表的SHARE鎖,將不會有沒有提交的數據,同
樣也不會有其他事務能夠對表數據進行改變,直到當前事務釋放SHARE鎖。
為了在REPEATABLE READ(重復讀)模式和SERIALIZABLE(序列化)模式下實現同樣的效果,必須在任何查詢和修改語句之前加上LOCK
TABLE。在執行第一句SELECT語句或者修改數據語句前,重復讀和序列化模式中一個事務的的數據視圖將會被存儲為快照。在這種情況
下,事務申明的表鎖同樣可以避免并發的修改,但是并不能保證該事務能夠讀取到最新提交的數據。
如果一個事務想要修改表中的數據,應該使用SHARE ROW EXCLUSIVE(共享行排他)鎖而不是SHARE鎖。共享行排他鎖將能夠保證在同
一時間只有當前事務能夠運行。不加這個鎖的話可能會造成死鎖:兩個事務同時想要獲取SHARE鎖,并且接下來又想要同時獲取ROW
EXCLUSIVE鎖去進行數據更新(注意:同一個事務獲取的兩種不同的鎖不會造成沖突,所以對于同一個事務,它可以在獲取SHARE鎖之后
再次獲取ROW EXCLUSIVE,當然是在沒有其他事務獲取SHARE鎖的情況下)。為了避免死鎖,應該保證所有的事務獲取同一對象的鎖的
順序是一致的,同時如果在同一個對象上想要獲取多個鎖,則總是應該先獲取限制最大的鎖。
ACCESS SHARE(訪問共享鎖)
只與ACCESS EXCLUSIVE鎖沖突。
SELECT命令會在當前查詢的表上獲取一個ACCESS SHARE鎖。總的來說,任何只讀操作都會獲取該鎖。
ROW SHARE(行共享鎖)
和EXCLUSIVE鎖和ACCESS EXCLUSIVE鎖沖突。
SELECT FOR UPDATE或者SELECT FOR SHARE命令會在目標表上獲取該鎖,并且所有被引用但是沒有FOR UPDATE的表上會加上ACCESS SHARED鎖。
ROW EXCLUSIVE(行排他鎖)
和SHARE,SHARE ROW EXCLUSIVE和ACCESS EXCLUSIVE鎖沖突。
UPDATE,DELETE和INSERT會在目標表上獲取該鎖,總的來說,任何對數據庫數據進行修改的命令會獲取到該鎖。
SHARE UPDATE EXCLUSIVE(共享更新排他鎖)
和SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE沖突,該鎖可以保護表防止并發的
(schema)改變和VACUUM(釋放空間)命令。
VACUUM,ANALYZE,CREATE INDEX CONCURRENTLY和ALTER TABLE VALIDATE以及其他ALTER TABLE類的命令會獲取該鎖。
SHARE(共享鎖)
和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE鎖沖突。該鎖保護
一個表防止并發的數據改變。
由CREATE INDEX命令獲得。
SHARE ROW EXCLUSIVE(行共享排他鎖)
和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE以及ACCESS EXCLUSIVE鎖沖
突,該鎖用于保護一個表防止并發的數據改變,同時是自排他的,所以在同一時間只有同一個session可以持有該鎖。
該鎖不會被PGSQL的任何命令自動獲取。
EXCLUSIVE(排它鎖)
和ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS
EXCLUSIVE鎖沖突。該鎖只允許并發的ACCESS SHARE鎖,只有只讀操作能在一個事務持有排他鎖的時候進行并發操作。
ACCESS EXCLUSIVE(訪問排他鎖)
和所有的鎖都沖突,該鎖保證只有持有鎖的事務能夠訪問當前表。
被DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL和REFRESH MATERIALIZED VIEW命令自動獲取。有很多種形
式的ALTER TABLE命令可以獲取該鎖,它同樣也是LOCK TABLE命令默認的鎖級別。
只有ACCESS EXCLUSIVE鎖可以防止一個SELECT語句。
注意
一段獲取鎖,只有當事務結束的時候才會釋放,但是如果一個鎖是在一個savepoint(保存點)之后被獲取,則當這個保存點回滾的時候這個鎖會被馬上釋放。
看完了這篇文章,相信你對postgresql鎖表的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。