天天看點

PG基礎篇--邏輯結構管理(鎖機制--表鎖)

pg的鎖有兩類,表級鎖和行級鎖。

表級鎖

表級鎖分類

ACCESS  SHARE 隻讀表不修改表申請該鎖模式
ROW SHARE select for update 和select for share 申請該鎖模式
ROW EXCLUSIVE DML申請該鎖模式
SHARE UPDATE EXCLUSIVE VACUUM、ANALYZE、CREATE INDEX CONCURRENTLY申請該鎖模式
SHARE create index 申請該鎖模式
SHARE ROW EXCLUSIVE 不會主動申請
EXCLUSIVE 不會主動申請
ACCESS EXCLUSIVE alter table ,drop table,truncate,reindex ,vacuum full 申請該模式的鎖

表級鎖概述

表級鎖隻有share和EXCLUSIVE兩種,也就是讀和寫鎖,share讀鎖加上後不能修改表,加鎖exclusive寫鎖後不能讀也不能寫,但是在多版本功能後,修改某一行資料,實際上并沒有改變原來那一行,而是另複制了一行資料,修改在新行上進行,事務不送出,别人是看不到修改行的,就沒有必要阻塞其他使用者讀資料了。

在多版本功能下,ACCESS share 表明加上這個鎖,即使是正在修改資料的情況下,也允許讀資料,另一個鎖ACCESS EXCLUSIVE 即使多版本功能,也不允許通路資料。

意向鎖

表級鎖的鎖粒度太大,出現了行級鎖,mysql獲得行鎖之前需要擷取意向鎖,pg中類似mysql也有ROW_SHARE 和ROW_EXCLUSIVE鎖。

意向鎖之間不會沖突,意向鎖和非意向鎖的沖突相容關系和普通鎖之間關系一樣。可以簡單轉換為X和S,在比較是否相容。

SHARE UPDATE EXCLUSIVE

就是把IX鎖之間的不相容變為更嚴格的一種鎖,針對不帶FULL的VACUUM,CREATE INDEX CONCURRENTLY都會申請該鎖。

SHAER ROW EXCLUSIVE

等同于加了S鎖和IX鎖

表鎖總結

PG中共8種鎖,共享鎖SHARE 和排它鎖EXCLUSIVE ,因為多版本的原因修改資料的同僚允許讀資料,于是有了ACCESS SHARE和ACCESS EXCLUSIVE鎖。

為了處理表鎖和行鎖之間的關系,歐了意向鎖的概念,ROW_SHARE 和ROW_EXCLUSIVE鎖,但是意向鎖之間不會沖突,為了更嚴格,出現了SHARE