锁定单个字段以在mariadb中进行独占访问

时间:2019-01-22 02:14:19

标签: php mariadb

我正在使用mariadb作为数据库在PHP中运行Web应用程序。在完成为客户执行的任务时,各种独立的脚本需要分配一个唯一的序列号(发票号)。即使发票的性质和格式以及生成时间和方式的发票不同,管理人员也希望在会计中显示通用的编号系统。我有一个系统参数表,下一个可用的发票号是其中的一个字段。

我需要每个独立脚本都能够分配下一个可用的发票编号,同时锁定其他试图执行相同操作的脚本。在仍处于锁定状态时,该编号随后递增以用于下一个进程。主要目标是避免重复编号而不会造成瓶颈。第二个目标是避免跳过某些数字而浪费数字。

能够锁定字段是理想的,尽管在大多数情况下仅锁定表就足够了。尽管随着时间的流逝,分配的数量不会很大,尽管将来会有所增加。

1 个答案:

答案 0 :(得分:0)

方案A:只需使用AUTO_INCREMENT。由于您需要单个ID流,因此必须具有用于生成id的单个表。不必担心那么多的影响。注意:在多主数据库(包括Galera /组复制)环境中,AUTO_INCREMENT值不是连续的。警告:尽量避免使用INSERT IGNOREREPLACE,IODKU和其他可能刻录ID的命令。

计划B:有一个专门用于此序号任务的表。编写一个存储函数以获取“下一个”数字。 通过自己的交易进行调用。这将最大限度地减少对其他活动的影响。

以上两种情况都避免使用重复ID。但是,您不能防止跳过数字。尽管如此,仍有一些事情可以避免跳过数字。最大限度地减少对ROLLBACK的需求。如果您进行ROLLBACK,则可能应该将丢失的ID应用于“空缺”发票。这样可以使会计师和审计师更快乐。

另一个问题:如果您使用复制,则不能保证数字将单调显示在从站上。这是因为获取ID的过程较早,但是复制是以COMMIT的顺序进行的。

我投票支持B计划(其中可能包含AUTO_INCREMENT)。它为您提供了一个集中的位置,可以进行经理要求的下一次更改。