PostgreSQL表锁定冲突

时间:2016-11-08 20:19:51

标签: postgresql

我在Explicit Locks上阅读此文档,以及PostgreSQL自动使用它们的时间。

当一个锁与另一个锁冲突时会发生什么?第二笔交易是否等到第一笔交易结束?它会中止吗?

所以说某些事务会在名为apples的表上打开一个ACCESS SHARE锁。然后说另一个事务尝试添加一个发出ALTER TABLE查询的列,这是一个ACCESS EXCLUSIVE锁。第二个查询会发生什么?它挂了吗?中止?

1 个答案:

答案 0 :(得分:0)

第二个查询ALTER TABLE等待第一个事务完成。您可以在pg_locks

中看到
Select * from pg_locks;

要模拟这种情况: -

1)在pgAdmin

中打开三个单独的SQL编辑器

2)SQL编辑器1:执行以下语句

BEGIN;
   Select * FROM table_name;

3)SQL编辑器2:使用pg_locks检查锁定。应该有AccessShareLock

4)SQL编辑器3:

BEGIN;
  alter table table_name ADD COLUMN new_column varchar(30);

窗口应显示Query is running

5)SQL编辑器2:使用pg_locks检查锁定。应该有AccessExclusiveLock

6)SQL编辑器1:执行END;(即结束选择事务)

7)SQL编辑器3:查询(即alter table)应该成功执行

8)SQL编辑器2:使用pg_locks检查锁定。不应该有任何“AccessShare”锁

9)SQL编辑器3:执行END;(即结束alter table事务)

10)SQL编辑器2:使用pg_locks检查锁定。不应该有任何“AccessExclusive”锁。