生成没有竞争条件的唯一条形码

时间:2016-08-17 11:24:21

标签: python django postgresql barcode race-condition

对于我们的客户,我需要生成独特的条形码。客户不得拥有两个相同的条形码。条形码的构建如下:

  • 客户前缀
  • 索引编号
  • 校验位

我想跟踪每个客户使用的最新索引号,并在生成条形码时,检索最新的索引号并将该索引号递增一个。

当两个进程尝试同时生成条形码时,会出现问题。进程A和B都询问最新的索引号,两者都接收相同的最新索引号,并且都创建相同的条形码代码。

有没有办法确保即使在异步提供条形码生成时,也不会生成重复的条形码?构建它的系统是Django 1.9,带有PostgreSQL数据库的Python 3.5。

1 个答案:

答案 0 :(得分:2)

这是支持数据库引擎的工具之一,那么如何将其用于此目的呢?这是一个sequence。它与用于生成主键值的工具完全相同(我假设在某些情况下由于某种原因不能选择,否则只需使用它)。

不幸的是,它不是由Django ORM处理的,但你可以像这样直接创建一个:

CREATE SEQUENCE barcodes START WITH 100;

然后,您可以通过从django应用程序执行直接SQL查询来随时使用它:

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute("select nextval('barcodes')")
    barcode = cursor.fetchone()

序列保证是唯一的。请注意,生成的数字可能存在间隙,因为回滚事务不会“恢复”推进序列。

现在您有一个保证的唯一编号,您可以将其插入条形码中,同时保证其独特性。

为方便起见,您可能希望在custom migration

中创建/删除序列