它是获取表的当前状态并在其中插入行,还是直接将行插入表中而不关心表的状态?
我问这个是因为我不确定同时发生并发插入行时会发生什么。
我脑海中出现的场景是,每个插入行都采用表的初始状态并向表中插入一行,因为它们同时发生,所以会发生竞争条件,最后插入的行会覆盖插入另一行,我不希望发生这种情况。
这是对发生的事情的正确理解吗?
对于更多上下文,我正在使用 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
这两个
INSERT
语句将各自在单独的事务中执行。这意味着插入将彼此独立执行。作为一般规则,MySQL 将保证每个事务都会成功执行。第二条语句可以覆盖第一个 INSERT
结果的唯一方法是,如果第二条语句是 update,或者删除,而不是另一个 INSERT
。