为什么Postgres自动增量计数器在Heroku DB故障转移期间会继续前进?

时间:2018-02-21 14:53:21

标签: postgresql

Heroku自动故障转移到关注者DB。

我注意到故障转移后某些自动增量主键列中存在间隙。例如。在故障转移之前,最新记录的ID为117019,下一条记录的ID为117052.没有记录被删除。

这不是一个问题,我只是好奇这里发生了什么,如果我可以正确地将其归因于故障转移,或者我应该寻找其他解释。< / p>

2 个答案:

答案 0 :(得分:1)

这些差距可能是回滚失败的交易的结果。

序列不是事务性的,也就是说,序列在回滚后不会再次返回相同的值。

这是故意的,请参阅the documentation

  

为了避免阻止从同一序列获取数字的并发事务,永远不会回滚nextval操作;也就是说,一旦获取了一个值,就会被认为是使用过的,并且不会再次返回。即使周围的事务稍后中止,或者调用查询最终没有使用该值,也是如此。 [...]此类情况将在指定值的序列中留下未使用的“漏洞”。因此,PostgreSQL序列对象 不能用于获得“无间隙”序列

答案 1 :(得分:0)

PostgreSQL序列或标识列是通常的序列。因此,您的序列可以采用多个值,但其中一些不使用。