作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 SELECT ... FOR UPDATE
语句时遇到 LOCK WAIT TIMEOUT 问题。
我准备了我不明白的场景。你能告诉我为什么前三个 block 立即执行,但最后一个要等待吗?
谢谢。
-- I'm using MariaDb
-- T1 is the mysql terminal window 1
-- T2 is the mysql terminal window 2
CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL
) COMMENT='' ENGINE='InnoDB' COLLATE 'utf8_bin';
INSERT INTO test SET name='foo';
T2: START TRANSACTION;
T1: START TRANSACTION;
T1: SELECT * FROM test WHERE id IN (1) FOR UPDATE;
T2: INSERT INTO test SET name='foo'; -- executed immediately
T2: START TRANSACTION;
T1: START TRANSACTION;
T1: SELECT * FROM test WHERE id IN (1,2) FOR UPDATE;
T2: INSERT INTO test SET name='foo'; -- executed immediately
T2: START TRANSACTION;
T1: START TRANSACTION;
T1: SELECT * FROM test WHERE id IN (1,2,3) FOR UPDATE;
T2: INSERT INTO test SET name='foo'; -- executed immediately
T2: START TRANSACTION;
T1: START TRANSACTION;
T1: SELECT * FROM test WHERE id IN (1,2,3,4) FOR UPDATE;
T2: INSERT INTO test SET name='foo'; -- waits for T1 to commit
T2: commit;
T1: commit;
最佳答案
InnoDB 行级锁是 index-locks in reality .一个较少记录的特性* 是:如果锁定 SELECT
不(或不能)使用(用户定义的)索引,则只能使用默认的聚集索引,并且整个表都被锁定。
优化器很可能决定索引对检查 IN()
参数的“长”列表没有用(可能是因为需要扫描表的大部分)。这会导致您检测到意外的副作用。
这个假设可以通过检查 execution plan 得到证实。 .
关于mysql - FOR UPDATE with IN 子句导致 LOCK WAIT TIMEOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690681/
我是一名优秀的程序员,十分优秀!