我们在MySQL中使用InnoDB有一个表,我们使用的是事务隔离级别read uncommitted.为什么设置@x
如图所示获得锁定?
mysql> set @x = (select userID from users limit 1);
Query OK, 0 rows affected (0.02 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
尝试从另一个提示更新此表会导致超时错误:
mysql> update users set userID = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Run Code Online (Sandbox Code Playgroud) 我已经看到很多解释为什么mysql跳过一些自动增量值(并且它不是一个bug,因为mysql从不声明它们应该是连续的).我不确定为什么它们中的任何一个适用于这个简单的测试用例.我不知道所有最新版本的mysql的结果是否相同.还添加:
ALTER TABLE test_table2 AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)
两个INSERT INTO test_table2行之间的顺序如下所示.
有谁知道为什么这个简单的案例会跳过ID 6和7?
CREATE TABLE test_table1 (
`id` INT NOT NULL AUTO_INCREMENT,
`test` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO test_table1(`test`) VALUES('value 1');
INSERT INTO test_table1(`test`) VALUES('value 2');
INSERT INTO test_table1(`test`) VALUES('value 3');
INSERT INTO test_table1(`test`) VALUES('value 4');
INSERT INTO test_table1(`test`) VALUES('value 5');
CREATE TABLE test_table2 (
`id` INT NOT NULL AUTO_INCREMENT,
`test` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO test_table2(`test`) SELECT `test` FROM test_table1;
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)