gpt4 book ai didi

sql - 安全递增 ID 所需的事务隔离级别

转载 作者:行者123 更新时间:2023-12-04 22:41:19 25 4
gpt4 key购买 nike

我正在编写一个小软件,用于将记录插入到商业应用程序使用的数据库中。相关表中的唯一主键(ids)是顺序的,但似乎没有设置为“自动递增”。因此,我假设,我必须找到最大的 ID,递增它并将该值用于我要插入的记录。

为简洁起见,在伪代码中:

id = select max(id) from some_table
id++
insert into some_table values(id, othervalues...)

现在,如果另一个线程在第一个线程完成插入之前启动相同的事务,您将得到两个相同的 ID,并且在尝试插入最后一个时会失败。您可以检查该失败并重试,但更简单的解决方案可能是在事务上设置隔离级别。为此,我需要 SERIALIZABLE 还是更低级别?

此外,这通常是解决问题的好方法吗?还有其他方法吗?

最佳答案

一种方法是将前两行合并到插入语句中:

INSERT INTO Some_Table VALUES ((Select Max(id) + 1 from Some_Table),Othervalues...)

INSERT INTO Some_Table SELECT st2.id, OthervaluesFROM (select max(id)+1 from Some_Table) st2

否则,您真正想做的是将其锁定在事务中并防止其他人阅读 第一行,并以重复的 ID 结束......但是通过阻止读取,你打开了一个更大的蠕虫 jar 头。

在其他系统中,我已经看到使用了一个表来存储最大键 - 这样你就可以在递增时锁定 max_keys 表并且你的问题消失了 - 但听起来你被供应商的表结构所困。

关于sql - 安全递增 ID 所需的事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2728977/

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