通过提交顺序保证PostgreSQL串行列值的单调性

rep*_*rep 6 postgresql locking transactions

我的团队需要一个串行列来随着每次提交单调增加.

有些情况下,两笔交易获得值的情况下100,并101从序列,那么100交易需要更长的时间来提交,所以价值101首先得到承诺,其次是100.这种情况对我们的需求是有问题的,我们需要解决它.

这正是这个问题所描述的问题.我们需要一个不需要更改数据库配置的解决方案,这与该问题的已接受答案不同.

对该解决方案的评论以及本文建议使用在获取值之前开始的独占事务咨询锁.

有没有办法让Postgres自动获取此锁并在序列到达INSERT相关表时从序列中获取值?

注意:提交的值中的间隙是可以预期的.

编辑:我已经深入研究这个问题,能够很好地问它,但我对Postgres不是很有经验.我希望指向特定触发器的指针或任何特定的PG设置将实现此目的.

asc*_*erk 3

我知道您想要自动锁定,我建议您不要这样做,您也许可以使用存储过程或触发器来实现这一点,但是存储过程除了代码之外还有什么。另请参阅我的评论。

我的解决方案是:

My team needs a serial column to increase monotonically with each commit.

这是否意味着,

  • 不允许插入小于已存储最大值的值?
  • 该列的值中不允许存在间隙

我想你使用一个序列来创建这个值。然后,在提交之前,您应该立即获取特定的咨询锁, 请参阅 13.3.4,现在进行插入时,要么在模式中隐式使用该序列,要么通过在插入中查询显式地进行插入。尝试获取相同锁的事务的其他提交不能在锁定和提交之间进行,因此插入必须是顺序的。在事务结束时进行锁定和递增有助于保持较短的时间并防止死锁。该锁将与提交一起释放,下一个事务可能会获取它,并将获得序列的下一个值。