表级锁的类型
- 1.ACCESS SHARE(访问共享锁)
- 2.ROW SHARE(行共享锁)
- 3.ROW EXCLUSIVE(行排他锁)
- 4.SHARE UPDATE EXCLUSIVE(共享更新排他锁)
- 5.SHARE(共享锁)
- 6.SHARE ROW EXCLUSIVE(行共享排他锁)
- 7.EXCLUSIVE(排它锁)
- 8.ACCESS EXCLUSIVE(访问排他锁)
- 9.表级锁冲突模式
- 10.锁类型对应的数据库操作
表级锁的类型:
可在pg源码/src/include/storage/lockdefs.h中查看对锁类型的定义和简单说明。
1.ACCESS SHARE(访问共享锁)
- 只与ACCESS EXCLUSIVE锁冲突。
- SELECT命令会在当前查询的表上获取一个ACCESS SHARE锁。总的来说,任何一个对表的只读操作都会获取该锁。
2.ROW SHARE(行共享锁)
- 与EXCLUSIVE锁和ACCESS EXCLUSIVE锁冲突。
- SELECT FOR UPDATE或者SELECT FOR SHARE命令会在目标表上获取该锁,并且所有被引用但是没有FOR UPDATE的表上会加上ACCESS SHARED锁。
3.ROW EXCLUSIVE(行排他锁)
- 和SHARE,SHARE ROW EXCLUSIVE和ACCESS EXCLUSIVE锁冲突。
- UPDATE,DELETE和INSERT会在目标表上获取该锁,总的来说,任何对数据库数据进行修改的命令会获取到该锁。
4.SHARE UPDATE EXCLUSIVE(共享更新排他锁)
- 和SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE冲突,该锁可以保护表防止并发的(schema)改变和VACUUM(释放空间)命令。
- VACUUM,ANALYZE,CREATE INDEX CONCURRENTLY和ALTER TABLE VALIDATE以及其他ALTER TABLE类的命令会获取该锁。
5.SHARE(共享锁)
- 和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁冲突。该锁保护一个表防止并发的数据改变。
- 由CREATE INDEX命令获得。
6.SHARE ROW EXCLUSIVE(行共享排他锁)
- 和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE以及ACCESS EXCLUSIVE锁冲突,该锁用于保护一个表防止并发的数据改变,同时是自排他的,所以在同一时间只有同一个session可以持有该锁。
- 该锁不会被PGSQL的任何命令自动获取。
7.EXCLUSIVE(排它锁)
- 和ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁冲突。该锁只允许并发的ACCESS SHARE锁,只有只读操作能在一个事务持有排他锁的时候进行并发操作。
8.ACCESS EXCLUSIVE(访问排他锁)
- 和所有的锁都冲突,该锁保证只有持有锁的事务能够访问当前表。
- 被DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL和REFRESH MATERIALIZED VIEW命令自动获取。有很多种形式的ALTER TABLE命令可以获取该锁,它同样也是LOCK TABLE命令默认的锁级别。
- 只有ACCESS EXCLUSIVE锁可以防止一个SELECT语句。
9.表级锁冲突模式
10.锁类型对应的数据库操作
锁类型 | 对应的数据库操作 |
---|---|
ACCESS SHARE | SELECT |
ROW SHARE | SELECT FOR UPDATE,SELECT FOR SHARE |
ROW EXCLUSIVE | UPDATE,DELETE,INSERT |
SHARE UPDATE EXCLUSIVE | VACUUM(WITHOUT FULL),ANALYZE,CREATE INDEX CONCURRENTLY |
SHARE | CREATE INDEX |
SHARE ROW EXCLUSIVE | 任何命令不会自动获得 |
EXCLUSIVE | 任何命令不会自动获得 |
ACCESS EXCLUSIVE | ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL |