我正在使用mariadb作为数据库在PHP中运行Web应用程序。在完成为客户执行的任务时,各种独立的脚本需要分配一个唯一的序列号(发票号)。即使发票的性质和格式以及生成时间和方式的发票不同,管理人员也希望在会计中显示通用的编号系统。我有一个系统参数表,下一个可用的发票号是其中的一个字段。
我需要每个独立脚本都能够分配下一个可用的发票编号,同时锁定其他试图执行相同操作的脚本。在仍处于锁定状态时,该编号随后递增以用于下一个进程。主要目标是避免重复编号而不会造成瓶颈。第二个目标是避免跳过某些数字而浪费数字。
能够锁定字段是理想的,尽管在大多数情况下仅锁定表就足够了。尽管随着时间的流逝,分配的数量不会很大,尽管将来会有所增加。
答案 0 :(得分:0)
方案A:只需使用AUTO_INCREMENT
。由于您需要单个ID流,因此必须具有用于生成id
的单个表。不必担心那么多的影响。注意:在多主数据库(包括Galera /组复制)环境中,AUTO_INCREMENT
值不是连续的。警告:尽量避免使用INSERT IGNORE
,REPLACE
,IODKU和其他可能刻录ID的命令。
计划B:有一个专门用于此序号任务的表。编写一个存储函数以获取“下一个”数字。 通过自己的交易进行调用。这将最大限度地减少对其他活动的影响。
以上两种情况都避免使用重复ID。但是,您不能防止跳过数字。尽管如此,仍有一些事情可以避免跳过数字。最大限度地减少对ROLLBACK
的需求。如果您进行ROLLBACK
,则可能应该将丢失的ID应用于“空缺”发票。这样可以使会计师和审计师更快乐。
另一个问题:如果您使用复制,则不能保证数字将单调显示在从站上。这是因为获取ID的过程较早,但是复制是以COMMIT
的顺序进行的。
我投票支持B计划(其中可能包含AUTO_INCREMENT
)。它为您提供了一个集中的位置,可以进行经理要求的下一次更改。