文章目录
前言
众所周知,MySQL默认的InnoDB存储有行锁和表锁,且支持事务。MyISAM存储引擎只支持表锁。那么什么情况下才会用到行锁呢?
一、无索引的情况下更新
1.1 建立测试数据表
1.2 我们查看表中的索引:
SHOW INDEX FROM test
1.3 查看存储引擎:
show table status from test where name='test'
1.4 打开session1,设置为手动提交:set autocommit=0; 然后执行以下SQL:
提示:这里如果没有设置手动提交的话,默认自动提交,很快就提交了,模拟不出阻塞的效果,手动提交模拟的就是在事务中的操作。
UPDATE test set name = 'a' WHERE number = 2
1.5 打开session2, 然后执行以下SQL:
UPDATE test set name = 'b' WHERE number = 3
可以看到执行阻塞住了…
InnoDB不是有行锁吗?对于不同行数据的更新操作怎么会阻塞呢?
二、有索引的情况下更新
2.1 建立索引
ALTER TABLE `test`
ADD INDEX `idx_numer`(`number`) USING BTREE;
2.2 查看当前的索引:
2.3 打开session1,然后执行以下SQL:
UPDATE test set name = 'a' WHERE number = 2
2.4 打开session2, 然后执行以下SQL:
UPDATE test set name = 'b' WHERE number = 3
发现并没有阻塞,很快就执行完了。
三、总结:
InnoDB行锁是通过索引给索引上的索引项加锁来实现的,在不通过索引作为查询条件时,InnoDB会锁定所有的记录。