MySQL灵魂十三问之第四问: 什么情况下我们用到了InnoDB的行锁?


前言

众所周知,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会锁定所有的记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值