- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的团队需要一个序列列来随着每次提交单调增加。
有些情况下,两个事务从序列中获取值 100
和 101
,然后 100
事务需要更长的时间来提交,所以值 101
首先被提交,然后是 100
。这种情况对我们的需求来说是有问题的,我们需要解决。
这正是 this question. 描述的问题我们需要一个不需要更改数据库配置的解决方案,这与该问题的公认答案不同。
A comment on that solution ,以及 this post ,建议在获取值之前开始使用独占事务咨询锁。
有没有一种方法可以让 Postgres 在向相关表获取 INSERT
时自动获取此锁并从序列中获取值?
注意: promise 值中的差距是可以接受的并且是预期的。
编辑:我已经深入研究了这个问题,可以很好地提出这个问题,但我对 Postgres 的经验并不丰富。我希望有一个指向特定触发器或任何特定 PG 设置的指针将完成此操作。
最佳答案
我知道你想要一个自动锁定,我会反对,你可以使用存储过程或触发器,但除了代码之外还有什么是存储过程。另请参阅我的评论。
我的解决方案是:
我的团队需要一个序列列,以便在每次提交时单调增加。
这是否意味着,
我假设您使用一个序列来创建这个值。然后在提交之前,您应该立即获得一个特定的咨询锁 see 13.3.4现在你的插入要么在你的模式中隐式地使用序列,要么通过在你的插入中查询来显式地使用。尝试获取相同锁的事务的其他提交不能在锁定和提交之间进行,因此插入必须是顺序的。在事务结束时进行锁定和递增有助于保持时间短并防止死锁。锁会随着commit一起释放,下一个事务可能会获取它,并会得到序列的下一个值。
关于postgresql - 通过提交顺序保证 PostgreSQL 串行列值的单调性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45866187/
我是一名优秀的程序员,十分优秀!