0

我想为每一天创建唯一的订单号。所以理想情况下,例如在 PostgreSQL 中,我可以创建一个序列并为这些唯一数字读回它,因为读回既让我得到新数字又是原子的。然后在一天结束时,我会重置序列。

然而,在 sqlite3 中,我只看到整数字段类型的自动增量。所以说我设置了一个带有自动增量字段的表,并插入一条记录以获取新数字(似乎是一种非常低效的方法,但无论如何......)当我去读最大值时,谁来说另一个任务没有进入那里并插入了另一个记录,从而导致我读回一个错过,我的第一个任务太先进了(并且与另一个任务读回的内容重复。)

从概念上讲,我要求:

  • 快速锁定等待其他任务
  • 增量号
  • 检索号码
  • 开锁

...我只是不知道如何用 sqlite3 做到这一点。任何人都可以启发我吗?

4

2 回答 2

1

在 SQLite 中,自动递增字段旨在用作其记录的实际主键。您应该将其作为您的订单表的 ID。

如果您真的想拥有一个独立于相应表记录的原子计数器,请使用具有单个记录的表。ACID 通过事务确保:

BEGIN;
SELECT number FROM MyTable;
UPDATE MyTable SET number = ? + 1;
COMMIT;
于 2013-08-19T20:48:47.247 回答
0

好的,看起来 sqlite 要么没有我需要的东西,要么我错过了它。这是我想出的:

  • 将 zorder 声明为整数主键自动增量,订单表中的 zuid 整数

    这意味着每个新行都有一个递增的数字,从 1 开始

  • 生成一个随机数:

    rnd = int(random.random() * 1000000) # 非种子python使用系统时间

  • 创建新订单(为简单起见仅使用 SQL):

    '插入订单(zuid)值('+str(rnd)+')'

  • 使用随机数找到确切的订单号:

    '从订单中选择 zorder WHERE zuid = '+str(rnd)

  • 将该号码作为新订单号打包(newordernum)

  • 破坏随机数以降低碰撞风险

    '更新订单 SET zuid = 0 WHERE zorder = '+str(newordernum)

...现在我有一个独特的新订单,我知道正确的订单号是什么,读取冲突的风险降低到可以忽略不计,我可以准备该订单而不必担心我踩到另一个新创建的订单.

只是向您展示为什么 DB 作者实现序列,哈哈。

于 2013-08-20T05:55:27.257 回答