gpt4 book ai didi

MySQL 5 原子 id 生成器

转载 作者:可可西里 更新时间:2023-11-01 08:37:42 25 4
gpt4 key购买 nike

我的逻辑需要在插入之前知道表的 ID(插入时手动设置 ID)。因为使用这个 ID 的逻辑在多个服务器上,让 mysql 创建一个 id 可能是个好主意,但我写的函数不是原子的,所以在高负载下调用它会返回一些相同的,而不是唯一的数字:

CREATE FUNCTION `generate_document_log_id`() RETURNS BIGINT(16)
BEGIN
DECLARE R_ID BIGINT(16);
UPDATE document_log_sequence SET id = id + 1;
SELECT id INTO R_ID FROM document_log_sequence;
RETURN R_ID;
END

我正在使用带有一列“id”的表“document_log_sequence”来存储最后一个 ID 并为每个新 ID 增加它。也许解决方案远非如此,但我没有更多想法。

忘记解释了:只有一台数据库服务器和 n 个客户端。上面的函数不是(某种)线程安全的。

最佳答案

您可以使用交错 id 的策略

每个服务器的编号为 0 到 n,并将其服务器编号添加到以 n 为步长的序列中。一种实现方式是使用 AUTO_INCREMENT 表来生成 ID,然后在函数中使用该 ID,如下所示:

CREATE TABLE ID_CREATOR (ID INT AUTO_INCREMENT PRIMARY KEY);

假设有 3 个服务器,这个服务器是 1 号服务器,那么这个函数会为每个服务器赋予一个唯一的值:

CREATE FUNCTION generate_document_log_id() RETURNS INT
BEGIN
DECLARE NUMBER_OF_SERVERS INT DEFAULT 3; -- Or read from some table
DECLARE THIS_SERVER_ID INT DEFAULT 1; -- Or read from some table. Must be less than NUMBER_OF_SERVERS
INSERT INTO ID_CREATOR VALUES (); -- This creates the next id
RETURN LAST_INSERT_ID() * NUMBER_OF_SERVERS + THIS_SERVER_ID; -- Unique numbers that interleave each other
END

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

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