Postgresql锁模式


  下面介绍的几种锁的模式都是表级锁 。

  两个事务不能在同一时间在同一个表上持有相互冲突的锁。不过,一个事务绝不会和自身冲突。

  两个事务可以在同一时间在同一个表上持有不冲突的锁。例如第一个事务进行查询并锁定了表的查询功能,第二个事务进行修改并锁定修改功能。

  下面介绍表级锁的几种模式:

ACCESS SHARE (访问共享)

只与ACCESS EXCLUSIVE(访问独占)模式冲突。

SELECT命令获取此模式被引用表上的锁。 通常,任何查询只读取表而不修改它的命令都请求这种锁模式。

ROW SHARE (行共享,虽然叫行共享,但是是表级锁)

与EXCLUSIVE和ACCESS EXCLUSIVE锁模式冲突。

SELECT FOR UPDATE和SELECT FOR SHARE命令在目标表上需要一个这样模式的锁 (加上在所有被引用但没有ACCESS SHARE的表上的FOR UPDATE/FOR SHARE锁)。

ROW EXCLUSIVE (行独占,表级锁,排它锁)

与SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE锁模式冲突。

UPDATE,DELETE,INSERT命令自动请求这个锁模式 (加上所有其它被引用的表上的 ACCESS SHARE锁)。通常,这种锁将用来请求任何修改表中数据的命令。

SHARE UPDATE EXCLUSIVE (分享更新独占)

与SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE, ACCESS EXCLUSIVE锁模式 冲突。

模式改变和运行VACUUM并发的情况下,这个模式保护一个表。

VACUUM(不带 FULL选项),ANALYZE,CREATE INDEX CONCURRENTLY命令请求这样的锁。

SHARE (分享)

与ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE冲突。 这个模式避免表的并发数据修改。

CREATE INDEX(不带 CONCURRENTLY 选项)语句要求这样的锁模式。

SHARE ROW EXCLUSIVE (分享行独占)

与ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE冲突。

任何PostgreSQL命令都不会自动请求这个锁模式。

EXCLUSIVE (独占)

与ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE, ACCESS EXCLUSIVE冲突。 这个模式只允许并发 ACCESS SHARE 锁,也就是说,只有对表的读动作可以和持有这个锁模式的事务并发执行。

任何PostgreSQL命令都不会在用户表上自动请求这个锁模式。 不过,在某些操作的时候,会在某些系统表上请求它。

ACCESS EXCLUSIVE (访问独占)

与所有模式冲突(ACCESS SHARE,ROW SHARE,ROW EXCLUSIVE,SHARE
UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE, ACCESS EXCLUSIVE)。这个模式保证其所有者(事务)是可以访问该表的唯一事务

ALTER TABLE,DROP TABLE, TRUNCATE,REINDEX, CLUSTER,VACUUM FULL命令要求这样的锁。 在LOCK TABLE命令没有明确声明需要的锁模式时,它是缺省锁模式

【提示】只有ACCESS EXCLUSIVE阻塞SELECT (不包含FOR UPDATE/SHARE语句)。

本文摘抄自Postgresql中文手册:PostgreSQL 9.0.4 中文文档 13.3.1. 表级锁

猜你喜欢

转载自blog.csdn.net/qq_33247435/article/details/100204993