MySQL原子序列号生成器

时间:2014-06-23 07:01:49

标签: mysql c

由于多个机器环境,我的程序需要通过MySQL生成UNIQUE事务ID。

我使用以下MySQL功能,我认为它不是原子的,因为我认为它是。

DELIMITER $$

CREATE DEFINER=`` FUNCTION `getNextTXID`(dummy INT) RETURNS int(11)
DETERMINISTIC
BEGIN

DECLARE txid bigint(20);

SET txid = (SELECT next_txid FROM txid_seq LIMIT 1 FOR UPDATE);

IF txid > 15000000 THEN
    SET txid = 0;
END IF;

UPDATE txid_seq SET next_txid = txid + 500 LIMIT 1;

RETURN txid;

END

我之前使用的是last_insert_id,但是在强制执行15M后需要重新设置。我不能重现竞争条件100个进程中的任何一个实际获得相同的交易号码(一批500,如果申请用完所有500,再次获得)。

问题:

  1. 这是函数原子
  2. 其他正确的方法吗?
  3. 表:MyISAM
    存储引擎:MyISAM
    自动提交:TRUE

    编辑:
    我正在使用MySQL C API。 预先感谢任何申请。

1 个答案:

答案 0 :(得分:0)

它不是原子的,因为你分开阅读和写作。但是这应该以原子方式执行相同的操作,同时仍然从LAST_INSERT_ID()返回值:

UPDATE txid_seq SET next_txid = LAST_INSERT_ID((next_txid * (next_txid <= 15000000)) + 500) LIMIT 1;