这一篇主要是通过一个实验来进行描述,过程是比较枯燥的.

实验准备

create table test_lock(id int auto_increment primary key ,stock int) engine=innodb;

insert into test_lock(id,stock) value(1,50);

这里我把堆栈信息尽可能的简化,25个主要函数的名称和入参

后面为了突出主题,我对事务相关的函数加上这个开头死锁检测函数列表,一共10个函数

 

死锁检测函数列表A row_search_for_mysql(搜索行)

死锁检测函数列表B sel_set_rec_lock(判断是二级索引还是主键,然后对行加锁)

死锁检测函数列表C lock_clust_rec_read_check_and_lock(检查有锁堵塞)

死锁检测函数列表D lock_rec_lock 处理逻辑(检测锁的兼容性)

死锁检测函数列表E lock_rec_lock_slow处理逻辑(确认申请不到锁)

死锁检测函数列表F lock_rec_enqueue_waiting

死锁检测函数列表G lock_deadlock_check_and_resolve处理逻辑

死锁检测函数列表H lock_deadlock_search函数代码处理逻辑

死锁检测函数列表I lock_get_first_lock处理逻辑(第一个锁比较)

死锁检测函数列表J lock_get_next_lock函数代码处理逻辑(获取锁继续比较)

我们一个个来看这些函数的主要作用

死锁检测函数列表A row_search_for_mysql处理逻辑

作用:对数据库进行行的寻找

传入的参数是:

1.buf 缓存区,用于获取MySQl格式的行

2.mode 搜索的方式

3.prebuilt 预构表结构的相关信息

4.搜索的方向

返回结果:

@return DB_SUCCESS, DB_RECORD_NOT_FOUND, DB_END_OF_INDEX, DB_DEADLOCK,

DB_LOCK_TABLE_FULL, DB_CORRUPTION, or DB_TOO_BIG_RECORD */

在row_search_for_mysql搜索到行后,会对行进行加锁处理,也就是调用函数列表B sel_set_rec_lock处理逻辑

死锁检测函数列表B sel_set_rec_lock处理逻辑

作用:对一条记录进行加锁,返回结果为(DB_SUCCESS, DB_SUCCESS_LOCKED_REC, or error code)

参数列表和备注

1.btr_pcur_get_block(pcur),记录对应的page的指针地址

2.rec:rec = btr_pcur_get_rec(pcur)对于的行的指针地址

3.index:prebuilt->index,表的索引

4.offsets:offsets是一个数组,默认100个元素,offsets = rec_get_offsets(next_rec, index, offsets,ULINT_UNDEFINED, &heap);

5.prebuilt->select_lock_type 表锁的类型(LOCK_NONE,LOCK_S, or LOCK_X)

6.lock_type:这里指的是行级锁(LOCK_REC_NOT_GAP,LOCK_GAP,LOCK_ORDINARY(Next-Key Lock))

7.thr:查询图查询线程节点 赋值thr = que_fork_get_first_thr(prebuilt->sel_graph);

死锁检测函数列表C lock_clust_rec_read_check_and_lock处理逻辑

作用:

检查其他事务的锁是否阻止立即读取或传递通过读取游标读取聚簇索引记录.

这个函数的作用主要是检查其他事务的锁是否堵塞了当前读,或者通过传递一个读取游标来读取主键索引记录。

如果他们这样做,首先测试

如果查询线程应该由于某种原因暂停;

如果没有,那么将事务和查询线程置于锁等待状态,并插入一个等待对锁队列的记录锁请求。

设置请求的模式锁定在记录上

死锁检测函数列表D 函数 lock_rec_lock 处理逻辑

作用:

尝试去对指定的行进行加锁,如果不能进行加锁,则进入lock_rec_lock_slow函数里面的处理逻辑

死锁检测函数列表E函数 lock_rec_lock_slow处理逻辑

作用:事务所请求的锁和别的事务有冲突(别人已经持有),进入lock_rec_enqueue_waiting进行处理

死锁检测函数列表F 函数 lock_rec_enqueue_waiting处理逻辑

作用:进入死锁检测函数lock_deadlock_check_and_resolve

死锁检测函数列表G 函数 lock_deadlock_check_and_resolve处理逻辑

作用:构造锁竞争的信息,然后把锁竞争的信息带入到lock_deadlock_search函数

死锁检测函数列表H函数 lock_deadlock_search函数代码处理逻辑

作用:通过锁竞争信息,对比两个事务对于的记录的heap_no,看两个事务所持有的锁是否为对方所需要的,进入到lock_get_first_lock来进行遍历

死锁检测函数列表I 函数lock_get_first_lock处理逻辑

作用:把参与锁竞争的事务的第一个锁来和另外一个事务等待的锁进行比较,如果检测到等值的锁则返回锁信息。

返回值:返回第一个锁或者NULL

死锁检测函数列表J lock_get_next_lock函数代码处理逻辑

作用:返回值,返回事务锁持有的下一个锁或者NULL

谈谈MySQL死锁之二 死锁检测和处理源码分析的更多相关文章

  1. 动态代理学习(二)JDK动态代理源码分析

    上篇文章我们学习了如何自己实现一个动态代理,这篇文章我们从源码角度来分析下JDK的动态代理 先看一个Demo: public class MyInvocationHandler implements ...

  2. MySQL主从复制配置指导及PHP读写分离源码分析

    开发环境 master环境:ubuntu16.04.5LTS/i5/8G/500G/64位/mysql5.7.23/php7/apache2 slave环境:kvm虚拟机/ubuntu14.04.01 ...

  3. Java I/O系列(二)ByteArrayInputStream与ByteArrayOutputStream源码分析及理解

    1. ByteArrayInputStream 定义 继承了InputStream,数据源是内置的byte数组buf,那read ()方法的使命(读取一个个字节出来),在ByteArrayInputS ...

  4. equals和==方法比较(二)--Long中equals源码分析

    接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...

  5. 目标检测之yolo源码分析

    三.配置文件详解(config.py) import os # 数据集路径,和模型检查点路径 # # path and dataset parameter # DATA_PATH = 'data' # ...

  6. scrapy 源码解析 (二):启动流程源码分析(二) CrawlerProcess主进程

    CrawlerProcess主进程 它控制了twisted的reactor,也就是整个事件循环.它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor.另外还控制了一些信号操作 ...

  7. Solr4.8.0源码分析(19)之缓存机制(二)

    Solr4.8.0源码分析(19)之缓存机制(二) 前文<Solr4.8.0源码分析(18)之缓存机制(一)>介绍了Solr缓存的生命周期,重点介绍了Solr缓存的warn过程.本节将更深 ...

  8. ConcurrenHashMap源码分析(二)

    本篇博客的目录: 一:put方法源码 二:get方法源码 三:rehash的过程 四:总结 一:put方法的源码 首先,我们来看一下segment内部类中put方法的源码,这个方法它是segment片 ...

  9. 谈谈MySQL死锁 一

    数据越来越和我们的生活离不开,数据在生命周期的各个阶段有着不同的痛点和需求以及特殊场景. CURD是数据的四大基本需求:写入,更新,读取,删除. 今天,来谈一谈死锁问题 死锁是高并发下MySQL不可回 ...

随机推荐

  1. 《Java编程的逻辑》 - 文章列表

    <计算机程序的思维逻辑>系列文章已整理成书<Java编程的逻辑>,由机械工业出版社出版,2018年1月上市,各大网店有售,敬请关注! 京东自营链接:https://item.j ...

  2. Thinkphp基础配置

    访问项目中的index.phpApplication下会自动生成一些文件 在Application下建两个目录 一个Admin用来放后台中的文件 一个Public用来放公共文件 然后去Appplica ...

  3. 利用sed把一行的文本文件改成每句一行

    事实证明,至少在mac-osx上,利用sed插入一个换行符是很难的,常规的命令如: sed 's/[\.\?\!]/\n' file 是不可能的,会把那些标点符号变成n. 尝试了SO上的很多方法 ht ...

  4. BZOJ4989 [Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组 逆序对

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4989 题意概括 一条马路的两边分别对应的序列A.B,长度为n,两序列为1到n的全排列.当Ai=Bj ...

  5. BZOJ1068 [SCOI2007]压缩 区间动态规划 字符串

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1068 题目概括 (其实是复制的) 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中 ...

  6. Free DIY Tour HDU1224

    一道很好的dfs加储存路径的题目  :路径保存:每次dfs都存i 当大于max时 将临时数组保存到答案数组 并不是当 当前值大于最大值时更新路径 还要加上一个条件:能回去 #include<bi ...

  7. 试安装pyQt5+eric6+python安装

    1.先安装pip最新版 安装之前把sit-packages----pip旧版本删掉 然后再cmd输入pip install --user update pip 2.安装pyqt5 pip instal ...

  8. 解决winscp中普通用户无法上传、删除、移动文件

    上一篇博客中提到了winscp这个软件,这个软件可以利用sftp协议对linux服务器就行连接,然后方便我们对文件进行操作,但是如果是利用普通用户进行登陆的话,在对文件进行相关操作的时候会出现一些pe ...

  9. ES6 中的 Map和Set

    集合的概念以及和数组的区别 其实数组也是集合, 只不过数组的索引是数值类型.当想用非数值类型作为索引时, 数组就无法满足需要了. 而 Map 集合可以保存多个键-值对(key-value), Set ...

  10. Android-认识Bitmap

    Android-认识Bitmap 学习自 Android开发艺术探索 例行废话 在Android的各种APP中都被离不开各种各样的图片,有的图片很大,有的图片很小不管这样图片都是一种很吃内存的资源,而 ...