gpt4 book ai didi

MySQL 原子序列号生成器

转载 作者:行者123 更新时间:2023-11-30 00:07:53 25 4
gpt4 key购买 nike

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

我使用以下 MySQL 函数,我在 google 上查看它并不像我想象的那样是原子的。

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 个进程中的任何 2 个实际上获得相同的事务号(在 500 个批处理中,如果应用程序用完所有 500 个,则再次获得)。

问题:

  1. 这个函数是否具有原子性
  2. 还有其他正确的方法吗?

表:MyISAM
存储引擎:MyISAM
自动提交:TRUE

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

最佳答案

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

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

关于MySQL 原子序列号生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24360137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com