SQL插入语句流程是怎样的?

问题描述 投票:0回答:1

它是获取表的当前状态并在其中插入行,还是直接将行插入表中而不关心表的状态?

我问这个是因为我不确定同时发生并发插入行时会发生什么。

我脑海中出现的场景是,每个插入行都采用表的初始状态并向表中插入一行,因为它们同时发生,所以会发生竞争条件,最后插入的行会覆盖插入另一行,我不希望发生这种情况。

这是对发生的事情的正确理解吗?

对于更多上下文,我正在使用 MySQL,并且图片中的行不会由于唯一约束或其他原因而相互冲突,它们是成功插入的。

例如: 我有这张空桌子

CREATE TABLE IF NOT EXISTS test_table (
                    testOne INT,
                    testTwo VARCHAR(255),
                    PRIMARY KEY (testOne)
                );

并且这 2 个插入语句同时发生,

INSERT IGNORE INTO test_table (testOne, testTwo)
            VALUES (1, "two");
INSERT IGNORE INTO test_table (testOne, testTwo)
            VALUES (2, "three");

表格只会插入 1 行吗? 由于每个插入语句获取表的初始状态都是空的,并且根据哪个插入语句最后完成将覆盖另一个插入语句,导致只插入 1 行

我尝试打开4个终端,然后开始将彼此不冲突的数据行同时插入同一个表中。 之后我得到了插入的行数,即 9688,4 个终端中每个终端的数据具有相同的行数:2422,这意味着竞争条件没有发生,并且在此测试中所有插入都成功。 我测试了3次,得到了相同的结果,所以我假设我脑海中出现的场景应该是错误的,但你永远不能太确定,所以我正在寻求经验丰富的建议,因为我不太熟悉使用 SQL

sql mysql concurrency sql-insert race-condition
1个回答
0
投票

这两个

INSERT
语句将各自在单独的事务中执行。这意味着插入将彼此独立执行。作为一般规则,MySQL 将保证每个事务都会成功执行。第二条语句可以覆盖第一个
INSERT
结果的唯一方法是,如果第二条语句是 update,或者删除,而不是另一个
INSERT

© www.soinside.com 2019 - 2024. All rights reserved.