初学者从源码理解MySQL死锁问题
发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,通过好多个深夜艰难的单步调试,终于找到了一个理想的断点,可以看到大部分获取锁的过程代码在lock0lock.c的static enum db_err lock_rec_lock() 函数中,这个函数会
千家信息网最后更新 2025年02月07日初学者从源码理解MySQL死锁问题
通过好多个深夜艰难的单步调试,终于找到了一个理想的断点,可以看到大部分获取锁的过程
代码在lock0lock.c
的static enum db_err lock_rec_lock()
函数中,这个函数会显示,获取锁的过程,以及获取锁成功与否。
场景1:通过主键进行删除
表结构
CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`)) ENGINE=InnoDB;delete from t1 where id = 10;
可以看到,对索引 PRIMARY 加锁,mode = 1027,1027是什么意思呢?1027 = LOCK_REC_NOT_GAP + LOCK_X(非 gap 的记录锁且是 X 锁)
过程如下
结论:根据主键 id 去删除数据,且没有其它索引的情况下,此 SQL 只需要在 id = 10 这条记录上对主键索引加 X 锁即可
场景2:通过唯一索引进行删除
表结构做了微调,增加了 name 的唯一索引
构造数据CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `uk_name` (`name`)) ;INSERT INTO `t2` (`id`, `name`) VALUES (1,'M'), (2,'Y'), (3,'S'), (4,'Q'), (5,'L'); 测试sql语句delete from t2 where name = "Y"
来看实际源码调试的结果
第一步:
第二步:
结论:这个过程是先对唯一键 uk_name 加 X 锁,然后再对聚簇索引(主键索引)加 X 锁
过程如下
场景3:通过普通索引进行删除
构造数据CREATE TABLE `t3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `idx_name` (`name`) );INSERT INTO `t3` (`id`, `name`) VALUES (1,'N'), (2,'G'), (3,'I'), (4,'N'), (5,'X'); 测试语句:delete from t3 where name = "N";
调试过程如图:
结论:通过普通索引进行更新时,会对满足条件的所有普通索引加 X 锁,同时会对相关的主键索引加 X 锁
过程如下
场景4:不走索引进行删除
CREATE TABLE `t4` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`))INSERT INTO `t4` (`id`, `name`) VALUES (1,'M'), (2,'Y'), (3,'S'), (4,'Q'), (5,'L'); delete from t4 where name = "S";
总共有 5 把 X 锁,剩下的 3 把就不一一放上来了
结论:不走索引进行更新时,sql 会走聚簇索引(主键索引)对全表进行扫描,因此每条记录,无论是否满足条件,都会被加上X锁。还没完...
但是为了效率考量,MySQL做了优化,对于不满足条件的记录,会在判断后放锁,最终持有的,是满足条件的记录上的锁,但是不满足条件的记录上的加锁/放锁动作不会省略。
过程如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
索引
过程
条件
场景
结论
普通
数据
函数
结构
语句
更新
测试
源码
成功
艰难
代码
内容
动作
同时
多个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
gpu服务器组成结构
数据库递减函数
数据库设计案例 某学院
中电36软件开发
服务器还会保留吗
紫光服务器生产基地
携程数据库技术分析
临沂直播软件开发外包公司
安卓软件开发连不上真机
阿里云服务器宽度
服务器光驱读取文件
无数据库分类目录网站源码
进一步加强新时代网络安全
http协议服务器ip
海淀区信息化软件开发概况
合肥外观检测软件开发
票据通服务器名称只什么
程序员为网络安全保护
软件开发企业税收优惠税法
魔兽数据库模型id
华为软件开发培训
硬件研发好还是软件开发好
oracle数据库本地访问
软件开发以后发展怎么样
武科大数据库技术
零基础一个月过网络安全软考中级
国家安全教育网络安全课件
服务器系统需要安装360吗
工业能源管理系统软件开发价格
手机脚本如何安装在服务器