在 PostgreSQL 中生成无间隙 ID 序列而不使用重试逻辑
在需要无间隙唯一标识符的场景中,例如发票编号,生成这样的无间隙序列是一个常见的挑战。查询最后使用的数字并递增它的传统方法可能会在序列化隔离级别下遇到问题,从而使任务复杂化。
理解间隙生成问题
间隙生成问题数字序列的产生是由于数据库机制。当已生成号码的事务回滚或遇到错误时,数据库会将已使用的号码标记为“已使用”,但实际上并不分配该号码。这会导致未来生成的序列中存在潜在的间隙。
替代间隙消除技术
专用数字生成器表:
不要使用序列,而是维护一个专用表来存储和管理生成的数字。该表可以设计为使用适当的锁定机制来处理并发访问。
封装数字生成逻辑:
创建一个封装数字生成逻辑并序列化的函数或过程使用锁定机制进行访问。这种方法确保所有进程使用相同的方法并防止冲突。
延迟数字生成:
将数字的生成推迟到交易中的最后可能时刻。这可以最大程度地减少因回滚或错误而导致潜在间隙的机会窗口。
处理错误:
实施一种机制,将生成的数字“返回”到池中,如果交易失败。这可以确保数字不会丢失并且可以在以后的尝试中使用。
原始文章参考:
有关更多见解,请参阅标题为“The使用数据库保持发票号码连续的困难”作者:Simon Fell: https://blog.codinghorror.com/the-difficulty-of-keeping-invoice-numbers-continuous-using-databases/
以上是如何在 PostgreSQL 中生成无间隙 ID 序列而无需重试?的详细内容。更多信息请关注PHP中文网其他相关文章!