mysql update锁表_MySQL执行update语句是锁行还是锁表分析

我们在数据库执行update语句的时候,到底是锁表还是锁行?这里直接用MySQL上例子测试下。

一、环境准备

1、新建一个表create table test_update(

id BIGINTnotnullprimary key COMMENT'主键ID,雪花算法生成',

name VARCHAR(100)COMMENT'姓名',

user_no VARCHAR(20)COMMENT'用户编号'

);

2、插入两条数据insertintotest_update(id,name,user_no)values(1,'张三','001');

insertintotest_update(id,name,user_no)values(2,'李四','002');

二、开始测试

场景一:不加索引开启事务

sql1:update test_update set name=’张三1’ where user_no in(‘001’);

不提交事务

开启事务

sql2:update test_update set name=’李四1’ where user_no in(‘002’);

提交事务

我们发现在sql1不提交事务的情况下,sql2被阻塞了,只有当sql1的事务提交后sql2才会执行成功。

总结:在不加索引的情况下,update语句锁表。

场景二:加索引先在user_no加索引

ALTER TABLE test_update ADD INDEX index_name (user_no);

开启事务

sql1:update test_update set name=’张三1’ where user_no in(‘001’);

不提交事务

开启事务

sql2:update test_update set name=’李四1’ where user_no in(‘002’);

提交事务

我们发现在sql1不提交事务的情况下,sql2也执行成功了,也就是sql2不依赖于sql1的事务提交。

总结:在加索引的情况下,update语句锁行。

场景三:加索引,但是in里面是复杂查询

上面的例子in里面都是确定的值,加入in里面是查询出来的呢,如下例子(user_no已经加上索引)

开启事务

sql1:update test_update set name=’张三1’ where user_no in(select user_no from other_table where id=1);

不提交事务

开启事务

sql2:update test_update set name=’李四1’ where user_no in(select user_no from other_table where id=2);

提交事务

我们发现在sql1不提交事务的情况下,sql2被阻塞了,只有当sql1的事务提交后sql2才会执行成功,跟场景一结果一样。

总结:在加索引的情况下,in里面是不确定的值,update语句锁表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值