首页 > 开发 > MySQL > 正文

InnoDB普通的Select 语句不加任何锁?

2017-09-08 08:50:42  来源:网友分享

原料

CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `user` VALUES ('1', 'wang');INSERT INTO `user` VALUES ('2', 'meng');INSERT INTO `user` VALUES ('3', 'zhang');

问题

在一个终端执行SQL

BeginSelect * from user where id = 1 for update; # 加入X锁

另一个终端执行SQL

mysql> select * from user where id = 1;+----+------+| id | name |+----+------+|  1 | wang |+----+------+1 row in set

发现执行成功,说明InnoDB普通的Select语句不加任何锁

InnoDB行锁模式兼容性列表

当前锁模式/是否兼容/请求锁模式XIXSIS
X冲突冲突冲突冲突
IX冲突兼容冲突兼容
S冲突冲突兼容兼容
IS冲突兼容兼容兼容

解决方案

一般的select语句是不加锁呀

如果是count的话,会根据当前的事务级别,做一个类似于快照的东西,在里面算count,所以不会有问题额。

麻烦点赞,采纳啦