关于在PostgreSQL中创建新行时的锁定

时间:2018-01-05 12:55:29

标签: postgresql transactions

我正在努力更好地掌握PostgreSQL中的事务处理方式。我做了很多研究,但在以下问题上找不到任何答案。

问题1

我有两个隔离设置为 read committed 的事务,默认情况下。我还有下表:

create table test(a integer primary key);

让我们开始第一笔交易:

begin;
insert into test(a) values(1);

现在让我们开始第二次交易并做同样的事情:

begin;
insert into test(a) values(1);

现在我注意到第二个事务阻塞,直到第一个事务提交或回滚。这是为什么?为什么在第二个事务中只能在插入后继续并且在请求提交事务时抛出 unique-key-constraint-exception 而不是在插入调用后直接抛出异常?

问题2

现在,第二种情况。让我们从第一笔交易开始:

begin;
insert into test(a) values(1);
delete from test where a = 1;

现在让我们进入第二个交易:

begin;
insert into test(a) values(1);

现在我注意到第二个交易也在阻塞。为什么它在一条不存在的行上阻塞?

1 个答案:

答案 0 :(得分:0)

  

为什么它在一条不存在的行上阻塞?

因为两个事务都为主键插入了相同的值。第二个事务需要等待第一个事务的结果才能知道它是否成功。如果第一个事务提交,则第二个事务将因主键违例而失败。如果第一个事务回滚,则第二个事务中的插入成功。