mysql中的limit 1 for update的锁类型

 更新时间:2023年08月29日 16:47:31   作者:luwei9233  
这篇文章主要介绍了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的IP地址的实例方法

    查看连接mysql的IP地址的实例方法

    在本篇文章里小编给大家分享的是一篇关于查看连接mysql的IP地址的实例方法,有需要的朋友们可以参考下。
    2020-10-10
  • 增删改查sql语法基础教程

    增删改查sql语法基础教程

    为了准备面试,整理了一些SQL基本语句和自己的理解,作为备份,下面这篇文章主要给大家介绍了关于增删改查sql语法基础教程的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • SQL group by去重复且按照其他字段排序的操作

    SQL group by去重复且按照其他字段排序的操作

    这篇文章主要介绍了SQL group by去重复且按照其他字段排序的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Mysql使用简单教程(三)

    Mysql使用简单教程(三)

    这篇文章主要介绍了Mysql使用简单教程(三) 的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL删除数据用法及区别详解(DELETE、TRUNCATE 和 DROP)

    MySQL删除数据用法及区别详解(DELETE、TRUNCATE 和 DROP)

    MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失,这篇文章主要介绍了MySQL删除数据用法及区别(DELETE、TRUNCATE 和 DROP)的相关资料,需要的朋友可以参考下
    2025-11-11
  • MySQL 事务概念与用法深入详解

    MySQL 事务概念与用法深入详解

    这篇文章主要介绍了MySQL 事务概念与用法,结合实例形式深入分析了MySQL 事务基本概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • mysql 获取时间方式

    mysql 获取时间方式

    这篇文章主要介绍了mysql 获取时间方式,获取指定时间,获取当前时间等相关内容,需要的朋友可以参考一下,希望对你有所帮助
    2022-03-03
  • 详解MySQL子查询(嵌套查询)、联结表、组合查询

    详解MySQL子查询(嵌套查询)、联结表、组合查询

    这篇文章主要介绍了MySQL子查询(嵌套查询)、联结表、组合查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 浅谈一下MyISAM和InnoDB存储引擎的区别

    浅谈一下MyISAM和InnoDB存储引擎的区别

    这篇文章主要介绍了MyISAM和InnoDB存储引擎的区别,存储引擎是MySQL中特有的一个术语,其它数据库中没有,实际上存储引擎是一个表存储/组织数据的方式,今天就跟小编来看看MyISAM和InnoDB存储引擎的区别,需要的朋友可以参考下
    2023-04-04
  • 解决MySQL存储时间出现不一致的问题

    解决MySQL存储时间出现不一致的问题

    这篇文章主要介绍了解决MySQL存储时间出现不一致的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论