4

Test.id主键自动增量

当我使用这个 SQL 插入时

 INSERT INTO Test (id,name) values (null, "a") , (null, "b") , (null, "c")

如果有人使用

 INSERT INTO Test (id,name) values (null, "d")

而进程刚刚完成插入“a”

将导致(id,name)

(1,a) , (2,b) , (3,c) , (4,d)

(1,a) , (2,d) , (3,b) , (4,c)

或其他

4

2 回答 2

2

大多数 SQL 引擎默认不支持并发插入。但是,其中一些为您提供了在配置中允许的选项。

就其本身而言,插入是一个原子语句。这意味着数据库将在插入之前被锁定,并且只有在插入完成或失败后才会解锁。

例如,如果我编写这些语句并同时执行它们

INSERT INTO Test VALUES(null, 'a'), (null, 'b'), (null, 'c'), (null, 'd')

INSERT INTO Test VALUES(null, 'e'), (null, 'f')

本质上发生的是竞争条件。所以我的输出可以是

1 a, 2 b, 3 c, 4 d, 5 e, 6 f

或者

1 e, 2 f, 3 a, 4 b, 5 c, 6 d

我什至可以使用 INSERT SELECT 语句,它会锁定数据库,直到语句完全完成。

INSERT INTO Test select * from test2

因此,在您的情况下,一旦第一个查询开始运行,下一个查询将不得不等待,因此,输出将是

(1,a) , (2,b) , (3,c) , (4,d)
于 2013-02-20T09:45:28.277 回答
0

你无法预测会发生什么——任何一种选择都是可能的,这取决于谁更早地执行了它。

当您创建 AUTO_INCREMENT 列时,它只保证它是唯一的 - 不能保证它到底是什么,也不能保证它不会包含可能由回滚事务创建的漏洞。

于 2013-02-20T09:38:55.367 回答