我不知道如何正确模拟情况才能弄清楚,所以我会问:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`value` INT UNSIGNED NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;
我在一个请求中插入大量数据,例如 10,000 行:
START TRANSACTION;
INSERT INTO test (`value`) VALUES (1),(2),(3), ... , (10000);
COMMIT;
如果同时在另一个线程中有另一个类似的交易,自增字段会是顺序的值,没有间隙 1 ... 10000,还是混合来自另一个交易的值 ?
是否可以在请求期间锁定数据库?
我做什么:我需要偶尔插入大量具有多对多关系的数据,但脚本将在共享主机上工作,但对数据库查询有限制,并且无法执行 10000 INSERT + 10000 LAST_INSERT_ID + ~30000 INSERT到关联表中。所以我想出了如何减少对数据库的查询次数。
我会自己回答。无论数据库发生什么情况,当您在事务内部时,您只能看到事务内部发生的更改。因此,您需要这样做:
只有三个请求。
当使用单个查询(这是一个原子操作!)插入时,自动增量值块在执行插入之前被保留。所以不会有来自服务器邻居的“左插入”。
锁定整个数据库是没有意义的——只锁定使用过的表就足够了。