我在Explicit Locks上阅读此文档,以及PostgreSQL自动使用它们的时间。
当一个锁与另一个锁冲突时会发生什么?第二笔交易是否等到第一笔交易结束?它会中止吗?
所以说某些事务会在名为apples
的表上打开一个ACCESS SHARE锁。然后说另一个事务尝试添加一个发出ALTER TABLE
查询的列,这是一个ACCESS EXCLUSIVE
锁。第二个查询会发生什么?它挂了吗?中止?
答案 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”锁。