【Mysql一次死锁排查过程的全纪录分享】教程文章相关的互联网学习教程文章

MySQL数据库的一次死锁实例分析

1、故事起因于2016年11月15日的一个生产bug。业务场景是:归档一个表里边的数据到历史表里边,同是删除主表记录。2、背景场景简化如下(数据库引擎InnoDb,数据隔离级别RR[REPEATABLE])-- 创建表test1 CREATE TABLE test1 ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(10) NOT NULL, PRIMARY KEY (id) ); insert into test1 values(hello); -- 创建表test2 CREATE TABLE test2 ( id int(11) NOT NULL AUTO_INCREM...

MySQLredo死锁问题排查及解决过程分析【图】

问题背景 周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪,还好现场环境还在,为排查问题提供了一个好的环境,随即便投入到紧张的问题排查过程当中。问题实例表现如下:代码如下: 并发量为 384 的时候出现的问题; MySQL 服务器无法执行事务相关的语句,即使简单的 select 语句也无...

详解MySQL中的死锁情况以及对死锁的处理方法

当多个事务同时持有和请求同一资源上的锁而产生循环依赖的时候就产生了死锁。死锁发生在事务试图以不同的顺序锁定资源。以StockPrice表上的两个事务为例: 事务1START TRANSACTION; UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = 2002-05-01; UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = 2002-05-02; COMMIT;事务 #2START TRANSACTION; UPDATE StockPrice SET high = 20.12 WHERE s...

Mysql数据库死锁过程分析(selectforupdate)

近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据。我们Mysql的存储引擎是innodb,支持行锁。解决同时拿数据的方法有很多,为了更加简单,不增加其他表和服务的情况下,我们考虑采用select... for update的方式,这样X锁锁住查询的数据段,表里其他数据没有锁,其他业务逻辑还是可以操...

MySQL死锁问题分析及解决方法实例详解

MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1、MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 2、各种锁特点 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低 行级锁:开销大,加锁慢;会出现死锁;锁...

MySQL死锁套路之唯一索引下批量插入顺序不一致【图】

前言 死锁的本质是资源竞争,批量插入如果顺序不一致很容易导致死锁,我们来分析一下这个情况。为了方便演示,把批量插入改写为了多条 insert。先来做几个小实验,简化的表结构如下CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`a` varchar(5),`b` varchar(5),PRIMARY KEY (`id`),UNIQUE KEY `uk_name` (`a`,`b`) );实验1:在记录不存在的情况下,两个同样顺序的批量 insert 同时执行,第二个会进行锁等待状态 t1t2be...

一个mysql死锁场景实例分析【图】

前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录。涉及知识点:共享锁、排他锁、意向锁、间隙锁、插入意向锁、锁等待队列 场景隔离级别:Repeatable-Read表结构如下create table t (id int not null primary key AUTO_INCREMENT,a int not null default 0,b varchar(10) not null default ,c varchar(10) not null default ,unique key uniq_a_b(a,b),unique key uniq_c(c) );初始化数据insert i...

初学者从源码理解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;可以看到,对索引 PR...

通过唯一索引S锁与X锁来了解MySQL死锁套路【图】

在初学者从源码理解MySQL死锁问题中介绍了使用调试 MySQL 源码的方式来查看死锁的过程,这篇文章来讲讲一个常见的案例。 这次我们讲一段唯一索引 S 锁与 X 锁的爱恨情仇 我们来看一个简化过的例子# 构造数据 CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10),`level` int(11),PRIMARY KEY (`id`),UNIQUE KEY `uk_name` (`name`) ); INSERT INTO `t1` (`name`, `level`) VALUES (A,0);# 出现问题的sql...

由不同的索引更新解决MySQL死锁套路【图】

前几篇文章介绍了用源码的方式来调试锁相关的信息,这里同样用这个工具来解决一个线上实际的死锁案例,也是我们介绍的第一个两条 SQL 就造成死锁的情况。因为线上的表结构比较复杂,做了一些简化以后如下CREATE TABLE `t3` (`id` int(11) NOT NULL AUTO_INCREMENT,`a` varchar(5),`b` varchar(5),PRIMARY KEY (`id`),UNIQUE KEY `uk_a` (`a`),KEY `idx_b` (`b`) ) INSERT INTO `t3` (`id`, `a`, `b`) VALUES (1,1,2); # sql语句如...

详解MySQL(InnoDB)是如何处理死锁的【图】

一、什么是死锁 官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。 这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。二、为什么会形成死锁 看到这里,也许你会有这样的疑问,事务和谈判不一样,为什么事务不能使用完锁之后立马释放呢?居然还要操作完了之后一直持有锁?这就涉及到 MySQL 的并发控制了。 MySQL的并发控制有两种方式,一个是...

一次神奇的MySQL死锁排查记录【图】

背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁。有了上面的经验之后,本以为对于死锁都能手到擒来,没想到再一个阳光明媚的下午报出了一个死锁,但是这一次却没想象的那么简单。 问题初现 在某天下午,突然系统报警,抛出个异常:仔细一看好像是事务回滚异常,写着的是因为死锁回滚,原来是个死锁问题,由于我对My...

2021火爆全网系列:教你解决线上频出MySQL死锁问题!分享面经!【图】

前言 当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关是对客户端的入口与出口,在生产运行中极为重要,哪怕是简单的重启也会导致部分请求的丢失。 网关的路由配置这个时候就是一个大问题,是代码里面编写还是配置文件配置?他们都有一个致命的缺点,当有新的程序需要接入到网关进行路由或...

MySQL死锁系列-线上死锁问题排查思路【代码】【图】

前言MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分析解决时还需要了解 MySQL 锁冲突相关知识,所以一般遇到这些偶尔出现的死锁异常,往往一时没有头绪,不好处理。本篇文章会讲解一下如果线上发生了死锁异常,如何去排查和处理。除了系列前文讲解的有关加锁和锁冲突的原理还,...

【生产问题】mysql死锁和分库分表问题【代码】

记录生产mysql的问题点。 业务场景与问题描述 请求一个外部接口时,每天的请求量在900万左右。 分为请求项目和回执这两个项目。请求是用来调用外部接口,回执是接收发送的接口。 在发送请求前会先插入数据库。 在请求后,如果接口返回调用失败,会更新数据库状态为失败。 如果发送成功,则会等待上游给出回执消息后,然后更新数据库状态。 而在生产运行过程中,半年出现过两次mysql导致的mq消费者堆积的问题。 问题分析 记录两次不...