【问题标题】:Postgres: incrementing a counter fieldPostgres:增加一个计数器字段
【发布时间】:2015-10-10 03:47:09
【问题描述】:

如何在数据库中增加一个字段,即使有数千个与数据库的连接尝试一次增加它——它最后总是1000(如果从零开始)。

我的意思是,没有两个连接会增加相同的数字,从而导致增量丢失。

您如何同步并确保数据一致?是否必须为此进行商店程序?数据库“锁定”?这是怎么做到的?

【问题讨论】:

  • update the_table set the_column = the_column + 1 - 他们将按照发布更新语句的顺序等待,直到提交上一个更新。
  • 您在寻找“无缝序列”吗?您知道内置序列支持但不想使用它吗?

标签: postgresql


【解决方案1】:

您正在寻找的是 Postgres SEQUENCE

您致电nextval('sequence_name') 以获取序列中的下一个号码。

根据the docs, 序列的设计考虑了并发性:

为避免阻塞从同一序列中获取数字的并发事务,nextval 操作永远不会回滚;也就是说,一旦获取了一个值,它就被认为是已使用的,即使执行 nextval 的事务稍后中止。这意味着中止的事务可能会在赋值序列中留下未使用的“漏洞”。

编辑:

如果您正在寻找无缝序列,2006 年有人在 PostgreSQL 邮件列表中发布了一个解决方案:http://www.postgresql.org/message-id/44E376F6.7010802@seaworthysys.com。似乎还有关于锁定等的冗长讨论。

即使从未接受过答案,也有人在 SO 上提出了无缝序列问题: postgresql generate sequence with no gap

【讨论】:

  • 其实我怀疑不是。如果连接在提交之前回滚,数据库服务器重新启动等,就会有间隙。我怀疑他们正在寻找避免这种情况的方法。
  • 嗯。也许你是对的。请参阅我上面的编辑。如果两个连接增加了相同的数字,则会失去一致性并且存在间隙。我认为一致性是主要问题,而不是差距。
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 2018-09-18
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多