美文网首页
mysql Innodb 锁行还是锁表

mysql Innodb 锁行还是锁表

作者: 小玲子之凌空蹈虚 | 来源:发表于2018-06-05 21:37 被阅读0次

一般情况下,mysql Innodb是行级锁,但是在项目中居然出现了死锁,锁表的情况,为什么呢?先看例子:

项目中有个业务逻辑是这样的,添加自选股的时候,查询当前自选股组下面有没有达到最大值,如果未达到最大值,那么此分组下的其他的自选股排序顺序要加1,sql如下:

//根据条件查询当前自选股组下面有多少条自选股

SELECT count(0) FROM t_user_self_stock WHERE user_id = #{userId} AND block_group_id = #{blockGroupId}

//根据条件查询自选股的条数

UPDATE t_user_self_stock SET stock_sort = stock_sort+1 WHERE user_id = #{useId} AND block_group_id=#{blockGroupId}

如果2个线程同时访问,当第一个线程查询自选股没有达到最大值,更新加1操作,第二个查询的时候也未达到最大值,但第一个更新还没完成,其实第一个线程已经达到了最大值,那第二个查到的数据,就是脏数据。mysql使用innodb引擎可以通过索引数据行加锁。sql修改如下:

SELECT count(0) FROM t_user_self_stock WHERE user_id = #{userId} AND block_group_id = #{blockGroupId} for update

UPDATE t_user_self_stock SET stock_sort = stock_sort+1 WHERE user_id = #{useId} AND block_group_id=#{blockGroupId}

commit;

第二个线程执行到select 语句的时候就会处于等待状态知道第一个执行commit;从而保证了第二个线程不会读到第一个线程修改前的数据。这样是不是就可以了,继续往下看:

相关文章

  • Innodb的锁

    Innodb的锁是行级锁 mysql delete是否会锁表 MySQL的InnoDB存储引擎支持行级锁,Inno...

  • InnoDB引擎的行锁和表锁

    在Mysql中,Innodb数据引擎支持行锁和表锁,Myisam数据引擎只支持表锁 1 行锁和表锁 行锁是通过索引...

  • 总结Mysql中的锁

    MySQL中的锁 概述 MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁 表级锁:开销小,加锁快,不会...

  • MySQL知识点

    Mysql中有哪几种锁? MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁 表级锁:开销小,加锁快,不...

  • MySQL技术内幕InnoDB存储引擎阅读相关笔记-锁

    一、InnoDB锁 对于MyISAM引擎来说,其锁是表锁。InnoDB引擎提供行锁。 1、InnoDB行锁 1)、...

  • mysql Innodb 锁行还是锁表

    一般情况下,mysql Innodb是行级锁,但是在项目中居然出现了死锁,锁表的情况,为什么呢?先看例子: 项目中...

  • 27、说说什么是锁升级?

    说说什么是锁升级? MySQL 行锁只能加在索引上,如果操作不走索引,就会升级为表锁。因为 InnoDB 的行锁是...

  • MySQL锁系列之锁的种类和概念

    在mysql当中,关于innodb的锁类型总共可以分为四种,包含了行锁和表锁,分别是 基本锁 - [ 共享锁(Sh...

  • 校招面试题mysql锁总结

    目录 锁定义 锁分类 读锁和写锁 表锁和行锁 InnoDB共享锁和排他锁 InnoDB意向锁和排他锁 InnoDB...

  • MySQL MyISAM和Innodb存储引擎的区别

    (1)InnoDB支持事务,MyISAM不支持事务。 (2)InnoDB支持行锁也支持表锁,MyISAM支持表锁。...

网友评论

      本文标题:mysql Innodb 锁行还是锁表

      本文链接:https://www.haomeiwen.com/subject/lujhsftx.html