gpt4 book ai didi

mysql - 间歇性地从 mysql innodb 查询中获取旧数据

转载 作者:搜寻专家 更新时间:2023-10-30 23:45:23 25 4
gpt4 key购买 nike

我们有各种表格来表示各种类型的数据。每个表都有一个相应的修订表来跟踪此数据的历史记录。每个修订(修订表中的条目)都有一个唯一的编号。此编号存储在更改元数据表中。这些表中的每一个都引用一个 parent_id。在我们对表进行任何更改之前,我们使用 SELECT ... FOR UPDATE 锁定父行。

进行更新/插入后,我们还会增加更改编号并将该编号写入更改元数据表。为此,我们对更改元数据编号执行 SELECT MAX,然后递增它。

我们看到的问题是事务以某种方式从 select max 语句中获取旧的更改编号。举例说明:

交易 1:

开始交易

用FOR UPDATE锁定

做事...

获取最新的变更号 (9)

插入编号为 10 的修订

提交

交易 2:

开始交易

用FOR UPDATE锁定

做事...

获取最新的变更号 (7)

插入编号为 8 的修订

提交

这会导致事务 2 的修订插入失败,因为更改编号是唯一键。我倾向于这是一个可重复读取的问题,但我不确定旧数据如何以这种方式跨事务持续存在。对于每个事务都有一个 START TRANSACTION 语句,然后立即使用 FOR UPDATE 锁定父 ID。我们有一个具有多个并发事务的高流量站点。任何时候都可能有很多人在等待锁。我很乐意澄清任何一点,并感谢任何人提供的任何见解。

最佳答案

SELECT MAX on the change metadata number

这也需要 FOR UPDATE

另一种方法:

有一个“序列号生成器”表。

CREATE TABLE Sequence (
pk TINYINT NOT NULL,
seq INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(pk), -- For ON DUPLICATE KEY UPDATE
INDEX(seq) -- Sufficient for AUTO_INCREMENT
);

唯一的 Action (一旦初始化)应该是

INSERT INTO Sequence (pk, seq) VALUE (1, 0)
ON DUPLICATE KEY UPDATE seq := LAST_INSERT_ID(seq+1);

这将自动更新一行。然后(在同一连接中)执行此操作以获得新的 seq:

SELECT LAST_INSERT_ID();

该声明与连接相关联,因此其他人不可能获得您的号码。

关于mysql - 间歇性地从 mysql innodb 查询中获取旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29426768/

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