2

如果我有两个READ COMMITTEDPostgreSQL 数据库事务都使用相同的主键创建一个新行然后锁定该行,是否可以同时成功获取两个锁?

我的直觉是肯定的,因为这些新行都只存在于单个事务的范围内,但我很好奇新行和锁定在事务之间的处理方式是否不同。

4

1 回答 1

2

不会。
主键是通过UNIQUE(目前仅)b-tree 索引实现的。根据文档,这是尝试写入索引时发生的情况:

如果一个尚未提交的事务插入了冲突的行,那么潜在的插入者必须等待以查看该事务是否提交。如果它回滚,则没有冲突。如果它在没有再次删除冲突行的情况下提交,则存在唯一性违规。(实际上,我们只是等待另一个事务结束,然后重新进行可见性检查。)

大胆强调我的。
您可以并行使用两个打开的事务(两个不同的会话)来尝试它。

于 2014-08-18T23:36:11.750 回答