我的团队需要一个串行列,以便在每次提交时单调增加。
在某些情况下,两个事务从序列中获取值100
和101
,然后100
事务需要更长时间才能提交,因此值101
将被提交首先,然后是100
。这种情况对我们的需求是有问题的,我们需要解决它。
这正是this question.描述的问题。我们需要一个不需要更改数据库配置的解决方案,这与该问题的已接受答案不同。
A comment on that solution以及this post建议在获取值之前使用独占事务通知锁。
有没有办法让Postgres自动获取此锁,并在序列获得INSERT
时从序列中获取值?
注意:提交的值中的间隙是可以预期的。
编辑:我已经深入研究了这个问题,能够很好地提出这个问题,但我对Postgres并不是很有经验。我希望有一个指向特定触发器的指针或任何特定的PG设置来完成此任务。答案 0 :(得分:3)
我知道你想要一个自动锁定,我建议不要这样做,你可能可以使用存储过程或触发器,但除了代码之外还有什么是存储过程。另请参阅我的评论。
我的解决方案是:
My team needs a serial column to increase monotonically with each commit.
这是否意味着,
我想您使用序列来创建此值。然后,在提交之前,您应该获得特定的建议锁 see 13.3.4,现在您的插入可以在您的架构中隐式使用序列,也可以通过查询插入。尝试获取相同锁的事务的其他任何提交都不能在锁定和提交之间获得,因此插入必须是顺序的。在事务结束时执行锁定和递增有助于保持时间短并防止死锁。锁将与提交一起释放,下一个事务可以获取它,并将获得序列的下一个值。