mysql 事务 intdb 锁表_Mysql upate 更新锁表还是锁行测试

mysql 学习

主题:

 -- 查询是否自动提交事务select @@autocommit;--关闭自动提交事务set autocommit = 0;--开启--执行--结束 事务start transaction;xxxx;commit;

测试结果与CSDN文章一致:(https://blog.csdn.net/wodeshouji6/article/details/104323875)

更新语句的条件存在索引命中则锁行,若未命中则锁表;另一条更新事务阻塞;

可见:where条件更新是走索引的。当我去除name字段索引时,分析是走全表的。

问题

  • 若更新字段存在索引,是否也会锁行?此时(phone无索引,name字段存在唯一索引)

100697695d2a4e0beae0b259dcc03ed3.png

可见,更新索引字段但where条件索引未命中是锁表的。

  • 使用批量更新是否会锁表?

批量更新两种方式:

第一种:循环根据id进行更新数据 ,可以断定一定是走主键索引的。

第二种更新:使用in进行更新数据  和加上 强制使用in(ids)作为主键索引 force index

update tb_user set phone = '123456789' where id in (1,2);

update tb_user force index (PRI) set phone = '123456789' where id in (1,2);

分析可见是走索引的更新。之前我测试过  但用in的范围索引,in的数据少是走索引的,如果in的数据多的话是走全表扫描的,因此,使用in的时候要留意这个问题。

批量更新数据的事务还没提交,但是另外一条更新是可更新的,

提交事务之后可见都可以命中更新的。也就是锁行更新。

02f08a75eda567782233f85db261865d.png

3014a759e2f1e0196bcb48962083eb58.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值