由于多个机器环境,我的程序需要通过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,再次获得)。
问题:
表:MyISAM
存储引擎:MyISAM
自动提交:TRUE
编辑:
我正在使用MySQL C API。
预先感谢任何申请。
答案 0 :(得分:0)
它不是原子的,因为你分开阅读和写作。但是这应该以原子方式执行相同的操作,同时仍然从LAST_INSERT_ID()
返回值:
UPDATE txid_seq SET next_txid = LAST_INSERT_ID((next_txid * (next_txid <= 15000000)) + 500) LIMIT 1;