表结构如下
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.
后来又有了新的认识,请看
http://kabike.iteye.com/blog/1828928
分享到:
相关推荐
innodb行锁实现的一些例子1
InnoDB行锁1
MySQL Innodb 索引原理详解
mysql innodb类型数据库表 根据ibd文件获取表 space id,用于恢复innodb类型数据表数据
20.MySQL高级锁InnoDB行锁行锁升级为表锁.avi 21.MySQL高级锁InnoDB行锁间隙锁危害.avi 22.MySQL高级锁InnoDB行锁争用情况查看.avi 23.MySQL高级锁InnoDB行锁总结.avi 24.MySQL高级SQL技巧SQL执行顺序及正则表达式....
Mysql 高可用 InnoDB Cluster 多节点搭建过程
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...
MySQL InnoDB 查询优化实现分析,欢迎下载,1111111111111
MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。
Innodb 通过多版本并发控制(MVCC)来获得高并发性,并且实现了sql标准的4种隔离级别,默认为repeatable_read 级别。同时使用一种 -- next-key locking 的锁策略来避免幻读现象的产生,还提供了插入缓冲(insert ...
基于CentOS7 搭建基于InnoDB引擎的Mysql 8 集群环境
MySQL体系结构及原理(innodb)图文完美解析
Mysql innodb tablespace 表空间实践
MySQL innodb 8.0 新特性 Oracle原厂工程师52页PPT MySQL innodb 8.0 新特性
MySql Innodb 引擎特性详解
MySQL 和 InnoDB 性能
mysql 5.6 新特性 innodb
MySQL innodb 技术内幕
MySQL Innodb 参数详解与优化实践