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