mysql中的limit 1 for update的锁类型
mysql limit 1 for update的锁类型
最近遇到一个业务问题,购物券号是预先产生的,然后进行客户ID的绑定,从SQL上来讲基本上有两种方式实现
方式一
begin; select * from purchase_code where code_type = 0 limit 1 for update; update purchase_code set code_type=1,user_id=123 where purchase_code_id = 1 commit
方式二
update purchase_code set code_type=1,user_id=123 where code_type=0 limit 1;
之前一直担心方式一会出现问题;主要是担心会因为并发问题,导致选出来的行被其他线程所修改掉,因为一直会觉得第一种方式加的是行锁,需要查出来继续判断一下code_type才能进行更新。
进行测试了一下发现上面两种方式加的都是表锁。
因为什么原因上面加的是表锁呢?
经过测试,mysql加锁有这样的特点:
主键查询加行锁
begin; select * from t_user_role where role_id = "1111" limit 1 for update ;
此时可以对其他行加读锁和写锁
select * from t_user_role where role_id = 'operator'; select * from t_user_role where role_id = 'operator' for update
锁升级的情况
role_id为varchar类型,但是用int类型也能搜索出来,但是此时加的是表锁
select * from t_user_role where role_id = 1111 for update;
当按非主键查询的时候,此时mysql加的是表锁
此时下面的查询都会卡住
select * from t_user_role where role_type = 2 limit 1 for update ; select * from t_user_role where role_id = 'operator' for update;
如果对role_type加上一个key索引,情况就变得有意思
除了最后一次查询被卡住外,其他查询全部能返回
select * from t_user_role where role_type = 2 limit 1 for update ; select * from t_user_role where role_id = 'operator' for update; select * from t_user_role where role_id = '2222' for update; select * from t_user_role where role_type = 1 limit 1 for update ;
研究innodb的锁机制发现
innodb是通过索引实现行锁,只有通过索引项查询的时候,才会加行锁,否则统一加的是表锁。
因此role_type上加索引之后,锁加在了role_type的索引上,从而上面其他三能顺利获得锁,但是此时已然无法获取表锁
mysql update limit 批量修改数据
1、想要实现修改数据库的5条之后的数据
update demo set flag='1' where user_id=1 limit 5,100;
上面这句测试了是错误的,MYSQL的UPDATE语句不能update限制从第N(5)条之后开始更新N(100)条。
2、建议方法
可以改变一下思维方式
- 1)先将全部flag修改为flag=1;
- 2)再按自己需求修改前N条,或者后N条数据falg=0;
①、
update demo set flag='1' where user_id = 1;
②、
修改数据前5条:
update demo set flag='1' where user_id=1 and flag='0' limit 5;
修改数据后5条:
update demo set flag='1' where user_id=1 and flag='0' order by id desc limit 5;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
mysql添加索引方法详解(Navicat可视化加索引与sql语句加索引)
索引用来快速地寻找那些具有特定值的记录,如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录,表里面的记录数量越多,代价就越高,下面这篇文章主要给大家介绍了关于mysql添加索引的相关资料,需要的朋友可以参考下2022-11-11
最新评论