原料
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行锁模式兼容性列表
当前锁模式/是否兼容/请求锁模式 | X | IX | S | IS |
---|---|---|---|---|
X | 冲突 | 冲突 | 冲突 | 冲突 |
IX | 冲突 | 兼容 | 冲突 | 兼容 |
S | 冲突 | 冲突 | 兼容 | 兼容 |
IS | 冲突 | 兼容 | 兼容 | 兼容 |
解决方案
一般的select语句是不加锁呀
如果是count的话,会根据当前的事务级别,做一个类似于快照的东西,在里面算count,所以不会有问题额。
麻烦点赞,采纳啦