表结构如下
现在只在列a上有索引
在两个客户端分别执行
第二个会等待超时
[Err] 1205 - Lock wait timeout exceeded; try restarting transaction
原来InnoDB不是只在最终要更新的行上加锁,而是在被扫描过的所有行上加锁.也就是说,
如果执行update 20121015_t set b=2 where b=1;其实表里所有的行都被加锁了.
他们官方文档说明如下
A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scanned in the processing of the SQL statement. It does not matter whether there are WHERE conditions in the statement that would exclude the row. InnoDB does not remember the exact WHERE condition, but only knows which index ranges were scanned.
后来又有了新的认识,请看[url]http://kabike.iteye.com/blog/1828928[/url]
CREATE TABLE `20121015_t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `20121015_t_a` (`a`)
) ENGINE=InnoDB现在只在列a上有索引
在两个客户端分别执行
update 20121015_t set b=4 where a=1 and b=3;update 20121015_t set b=2 where a=1 and b=1;第二个会等待超时
[Err] 1205 - Lock wait timeout exceeded; try restarting transaction
原来InnoDB不是只在最终要更新的行上加锁,而是在被扫描过的所有行上加锁.也就是说,
如果执行update 20121015_t set b=2 where b=1;其实表里所有的行都被加锁了.
他们官方文档说明如下
A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scanned in the processing of the SQL statement. It does not matter whether there are WHERE conditions in the statement that would exclude the row. InnoDB does not remember the exact WHERE condition, but only knows which index ranges were scanned.
后来又有了新的认识,请看[url]http://kabike.iteye.com/blog/1828928[/url]
本文通过具体的表结构和更新操作示例,详细解释了MySQL InnoDB存储引擎在执行更新操作时的锁定行为。揭示了即使有WHERE条件限定,InnoDB也会在扫描到的所有行上加锁,而非仅限于最终要更新的行。
1571

被折叠的 条评论
为什么被折叠?



