自动增量 ID 是否可以在提交时更改为事务中值?

Rus*_*uss 4 sql transactions commit rdbms-agnostic auto-increment

对我来说,这种情况发生的可能性似乎极不可能,因为它可能会导致问题,但我想无论如何我都会问这个问题......

想象一下一个涉及自增 ID 并分配值的事务。在 COMMIT 之前,相关代码会缓存分配的 ID 的副本以供以后参考。然后事务被提交。

假设没有直接的客户端干预(删除或更改记录),是否有任何数据库或情况会在提交后立即自动更改 ID 值,从而使缓存的 ID 不正确?在事务中缓存 ID 总是安全的吗?

我可以想象这种情况发生的一个假设情况是,如果某些 RDBMS 实现莫名其妙地决定有必要拥有无间隙且与时间相关的自动增量值(因为我看到很多人希望这样做的例子)。在这种假设的情况下,我可以想象可能会进行一些神奇的 ID 改组,以填补另一个事务(或其他间隙原因)中 ID 分配后回滚所造成的间隙。这将使缓存的值无效。

有人知道这样的实现或其他缓存杀手吗?

psp*_*psp 5

生成的 id 值的实现通常涉及在短原子操作中递增计数器值。然后,该值由请求事务使用,即使该事务回滚,保留值也永远不会返回到空闲值池。所以从这个角度来看,我认为所描述的情况不太可能发生。另外,在 pl/sql 类型的程序中,您确实需要生成正确的值,以便将其他相关行插入到子表中。

对于那些想要按时间排序的无间隙 id 值的人:自动增量/代理键的唯一目的是为行创建人工标识。它应该与确定创建行的顺序无关。有更好的方法可以做到这一点,例如使用创建时间戳。