Postgres:如何增加计数器字段

4
如何在数据库中递增一个字段,以便即使有成千上万个连接同时尝试递增它,最终也会变为1000(如果从零开始)。
我的意思是,以便没有两个连接递增相同的数字导致丢失递增。
如何同步并确保数据一致性?这是否需要存储过程?数据库“锁定”?如何实现?

4
他们将按照发出更新语句的顺序等待,直到先前的更新提交后才会执行。需要翻译的内容是:"update the_table set the_column = the_column + 1" - user330315
你正在寻找“无间隙序列”吗?你是否知道内置的序列支持,但不想使用它? - Craig Ringer
1个回答

2
你正在寻找的是一个Postgres SEQUENCE
调用nextval('sequence_name')来获取序列中的下一个数字。
根据文档,序列的设计考虑了并发性:
为避免阻塞从同一序列获取数字的并发事务,nextval操作永远不会回滚;也就是说,一旦获取了一个值,即使之后执行nextval的事务失败,该值也被视为已使用。这意味着中止的事务可能会在分配值的序列中留下未使用的“空洞”。
编辑:
如果您正在寻找无间断序列,2006年有人在PostgreSQL邮件列表上发布了一个解决方案:http://www.postgresql.org/message-id/44E376F6.7010802@seaworthysys.com。似乎还有一些关于锁定等的长时间讨论。
即使从未有被接受的答案,"gapless-sequence"问题也曾在SO上提出过: postgresql generate sequence with no gap

1
实际上我怀疑这并不是这样的。如果在提交之前连接回滚,DB服务器重新启动等,就会出现间隙。我猜他们正在寻找一种避免这种情况的方法。 - Craig Ringer
嗯,你可能是对的。请查看我上面的编辑。如果两个连接增加相同的数字,则一致性会丢失,并且会出现间隔。我原本认为一致性是主要问题,而不是间隔。 - Travis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接