LOCK的语法定义
锁可以轻如ACCESS SHARE锁或者重如ACCESS EXCLUSIVE锁。下面的列表展示了 这些锁会做什么。
- ACCESS SHARE:这种类型的锁由读操作获取,它只与ACCESS EXCLUSIVE 冲突,后者会由DROP TABLE之类的操作获取。事实上,这意味着如果一个表 就要被删除,则不能开始一个SELECTo这也暗示着DROP TABLE不得不等待 直到一个正在读取的事务完成。
- ROW SHARE: PostgreSQL 会在 SELECT FOR UPDATE/SELECT FOR SHARE 的情况下取得这种锁。它与EXCLUSIVE以及ACCESS EXCLUSIVE冲突。
- ROW EXCLUSIVE:这种锁由 INSERT、UPDATE和 DELETE取得。它与 SHARE、 SHARE ROW EXCLUSIVE、EXCLUSIVE 还有 ACCESS EXCLUSIVE 冲突。
- SHARE UPDATE EXLUSIVE:这种锁由 CREATE INDEX CONCURRENTLY、 ANALYZE、ALTER TABLE> VALIDATE 和其他与 VACUUM (非 VACUUM FULL) 一样的 ALTER TABLE 形式取得。它与 SHARE UPDATE EXCLUSIVE> SHARE、SHARE ROW EXCLUSIVE> EXCLUSIVE 以及 ACCESS EXCLUSIVE 锁模式冲突。
- SHARE:当一个索引被创建时,将会设置SHARE锁。它与ROW EXCLUSIVE. SHARE UPDATE EXCLUSIVE、SHARE ROW EXCLUSIVE. EXCLUSIVE 和 ACCESS EXCLUSIVE 冲突。
- SHARE ROW EXCLUSIVE:这种锁由 CREATE TRIGGER 和某些形式的 ALTER TABLE设置,并且与除了 ACCESS SHARE之外的所有模式都冲突。
- EXCLUSIVE:这种类型的锁是目前为止最严格的一种。它保护操作不受读和写 的影响。如果一个事务取得了这种锁,任何其他人都不能读取或者写入受影响 的表。
- ACCESS EXCLUSIVE:这种锁阻止并发事务进行读取和写入。
应该不惜一切代价避免ACCESS EXCLUSIVE.
======
=========