线上碰到存储过程死锁问题了,开始以为非主键查询 for update 会导致表锁,后来经过测试 innodb下for update索引生效的情况下 根据索引字段查询是行级锁,会将整个结果集进行上锁,直到事务结束。

错误地方进行一些修正,一般情况的确是将索引的结果集进行上锁,但是由于表过大的情况,mysql为了性能自动优化将索引附近的结果集全部进行上锁。

具体实验过程可以看https://blog.csdn.net/qq_31975227/article/details/103710018,自己做一遍也能实验出来。

但是存储过程死锁的问题还是没有解决,不过该存储过程只是进行内存统计数据的落库,所以不应该上锁。虽然程序是node调用,但是也不会出现执行顺序问题,如果出现了执行顺序问题加了行级锁也是没有用的,又不是在源数据进行加减等计算操作,计算操作都在内存完成了,最后只进行了落库操作。(来至个人的吐槽,我没办法说法领导,后来和领导沟通说明白了问题)

死锁的问题通过分析死锁日志文件解决了,由于上面一块错误的认识。一直认为两个非唯一索引可以命中单条记录,其实mysql为了性能命中了多条。

一个简单的update语句,update ? where  id1=1 and id2=2 id1和id2 都是非唯一索引,这时有的语句会对因为优化导致上锁其他索引周边的数据条目,这时他会等待内建唯一索引的锁,而同样的语句会对内建唯一索引加锁,等待id1 或者id2的锁,出现同一条语句回环等待锁的释放,导致死锁发生。

以后还是需要多看一些数据库方面的书籍,对原理性知识了解的更多一些。

mysql 行级锁问题的更多相关文章

  1. mysql 行级锁的使用以及死锁的预防

    一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...

  2. mysql行级锁 select for update

    mysql行级锁 select for update 1.属于行级锁 2.where条件后需要写出明确的索引条件(如果有多个条件,可以建立联合索引) 3.如果其所在的事务提交或者回滚后,或者更新该条数 ...

  3. 论JAVA实现MYSQL 行级锁(分布式锁实现方案一)

    @Override @Transactional public String getCustomerId() { // return String.valueOf(getSequenceId(SEQ_ ...

  4. MySQL行级锁,表级锁,页级锁详解

    页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...

  5. MySQL行级锁、表级锁、页级锁详细介绍

    原文链接:http://www.jb51.net/article/50047.htm 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , ...

  6. MySQL行级锁和表级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  7. 你真的会用mysql行级锁吗?mysql 行级锁全解析

    在互联网大并发应用大行其道的今天,应用的开发总是离不开锁,在分布式应用中,最常见的莫过于基于数据库的行级锁了,由于互联网公司中比较主流的数据库还是mysql,所以这一话题绕不开的就是mysql了,但是 ...

  8. [MySQL] 行级锁SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE

    一.译文 翻译来自官方文档:Locking Reads If you query data and then insert or update related data within the same ...

  9. mysql行级锁和表级锁的区别

    表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低:行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高:

随机推荐

  1. 在cmd中启动tomcat

    E:\Documents and Settings\topicis>h: H:\>cd tomcat-test H:\tomcat-test>cd bin H:\tomcat-tes ...

  2. 如何提取CSDN博客正文内容

    document.getElementById("article_content").outerHTML; 在任意的一片博文运行以上代码都可以获得正文内容,但是对于代码.字体都没有 ...

  3. Lua使用luasocket http请求例子

    local http=require("socket.http"); local request_body = [[login=user&password=123]] lo ...

  4. [C/C++]_[Unicode转Utf8,Ansi转Unicode,Ansi文件转Utf8文件]

    http://blog.csdn.net/infoworld/article/details/15337665 场景: 1.也就只有windows需要那么麻烦,还搞一个ANSI编码.学学mac os ...

  5. 通俗易懂的ref和out区别

    ref 和 out 是C#开发中经常用到的两个关键字,但是很多人没有搞清楚这两个关键字的具体区别,下面我们来说一下这两个关键的区别. 零. ref 与 out 的异同 相同: 都是按地址传递: 使用后 ...

  6. 数据算法 --hadoop/spark数据处理技巧 --(3.左外连接 4.反转排序)

    三. 左外连接 考虑一家公司,比如亚马逊,它拥有超过2亿的用户,每天要完成数亿次交易.假设我们有两类数据,用户和交易: users(user_id,location_id) transactions( ...

  7. maven mvn 安装介绍

    maven是什么? Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具 Maven 除了以程 ...

  8. python上获得随机字符

    import random import string print(string.ascii_letters) # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO ...

  9. 全文检索框架---Lucene

    一.什么是全文检索 1.数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据.   结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等.   非结构化数据:指不定长或无固定格式 ...

  10. K8S 容器挂载Windows 文件共享目录,访问出现Permission denied的解决办法

    K8S Pod,Docker 容器挂载Windows主机目录,访问相应的文件出现Premission denied的权限访问问题 Windows远程共享目录为//192.168.61.115/huas ...