返回顶部
首页 > 资讯 > 数据库 >谈谈MySQL死锁 一
  • 401
分享到

谈谈MySQL死锁 一

2024-04-02 19:04:59 401人浏览 薄情痞子
摘要

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

数据越来越和我们的生活离不开,数据在生命周期的各个阶段有着不同的痛点和需求以及特殊场景。

CURD是数据的四大基本需求:写入,更新,读取,删除.


今天,来谈一谈死问题

死锁是高并发Mysql不可回避的一个问题。

这句话可以引申四个问题:

1.什么是死锁?

2.mysql什么时候会检测死锁?

3.数据库系统如何处理死锁?

4.有哪些典型的高并发死锁场景?


1.我们先来看看什么是死锁。

在《数据库系统实现》第八章第二节这样定义死锁

并发执行的事务由于竞争资源而到达一个存在死锁的状态:若干事务的每一个事务都在等待被其他事务占用的资源,因而每个事务都不能取得进展。

这个描述貌似很拗口,我们举两个例子来形象化认识一下:

1.两位木匠钉地板,一位只握一把斧头,而另一位没有榔头,却有钉子

2.堵车现象

谈谈MySQL死锁 一

看完死锁的定义描述和形象化认识,那对于Mysql,什么时候会进行死锁检测?


2.MySQL的死锁检测和回滚

这里谈论MySQL的死锁检测,目前仅讨论InnoDB的处理,暂不涉及MyRocks的死锁检测处理。

当InnoDB事务尝试获取(请求)加一个锁,并且需要等待时,InnoDB会进行死锁检测.

正常的流程如下:

1.InnoDB的初始化一个事务,当事务尝试获取(请求)加一个锁,并且需要等待时(wait_lock),innodb会开始进行死锁检测(deadlock_mark)

2.进入到lock_deadlock_check_and_resolve ,名字很明显了,要检测死锁和解决死锁

3.检测死锁过程中,也是有计数器来进行限制的

4.死锁检测的逻辑之一是等待图的处理过程,如果通过锁的信息和事务等待链构造出一个图,如果图中出现回路,就认为发生了死锁。

5.死锁的回滚,内部代码的处理逻辑之一是比较undo的数量


3.数据库系统如何处理死锁

我们回头继续看《数据库系统实现》里面提到的死锁处理

1.超时死锁检测:当存在死锁时,想所有事务都能同时继续执行通常是不可能的,因此,至少一个事务必须中止并重新开始。超时是最直接的办法,对超出活跃时间的事务进行限制和回滚

2.等待图:等待图的实现,是可以表明哪些事务在等待其他事务持有的锁,可以在数据库的死锁检测里面加上这个机制来进行检测是否有环的形成。

3.通过元素排序预防死锁:这个想法很美好,但现实很残酷,通常都是发现死锁后才去想办法解决死锁的原因

4.通过时间戳检测死锁:对每个事务都分配一个时间戳,根据时间戳来进行回滚策略。

这里贴一下等待图的示例

4.有哪些典型的高并发死锁场景?

1.秒杀场景,每个秒杀都是针对同一行的活跃事务,源源不断的事务发现自己加锁的那一行已经被人锁了,这时候InnoDB会进入一个蛋疼的没必要的死锁检测,后续给大家讲讲怎么解决 


2.使用二级索引去高并发更新二级索引记录(很拗口吧?),MySQL的索引计划不是100%准确的,我手上有case在并发更新不同记录的时候,因为索引计划走错了,导致某一个事务用了二级索引读记录,另外一个事务用主键来读记录,进而产生了死锁,这个案例后续也会整理出来。


最后 MySQL的源码如何进行死锁检测和处理?

这个问题是后续的关键,但没整理完,先歇一歇...

建议先读一读上一篇《InnoDB事务结构体代码变量列表》,因为死锁是在活跃事务等待锁的情况下才会去检测,要先去了解InnoDB事务结构体的trx_lock_t

您可能感兴趣的文档:

--结束END--

本文标题: 谈谈MySQL死锁 一

本文链接: https://lsjlt.com/news/48970.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 谈谈MySQL死锁 一
    数据越来越和我们的生活离不开,数据在生命周期的各个阶段有着不同的痛点和需求以及特殊场景。 CURD是数据的四大基本需求:写入,更新,读取,删除. 今天,来谈一谈死锁问题 死锁...
    99+
    2024-04-02
  • 浅谈MySQL 有哪些死锁场景
    目录1 环境准备2 同一张表下的死锁3 不同表下的死锁4 间隙锁下的死锁5 INSERT 语句的死锁首先一起来复习一下死锁的概念:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的...
    99+
    2022-08-11
    MySQL死锁场景 MySQL死锁
  • 浅谈Mysqlinsertonduplicatekey死锁问题定位与解决
    目录前言死锁定位insert on duplicate key的锁问题解决前言 最近在监测线上日志时发现我们一个Mysql业务db时常出现 dead lock,频次不高但却一直出现,...
    99+
    2024-04-02
  • 浅谈GO中的Channel以及死锁的造成
    目录写在前面引子问题抛出问题解释继续深入写在后面写在前面 这篇文章的诞生要感谢MIT 6.284课程。在其中一节课中,谈到了多线程的协同的一些问题,其中就涉及到了channel这个概...
    99+
    2024-04-02
  • 浅谈java安全编码指南之死锁dead lock
    目录不同的加锁顺序使用private类变量使用相同的Order释放掉已占有的锁不同的加锁顺序 我们来看一个不同加锁顺序的例子: public class DiffLockOrde...
    99+
    2024-04-02
  • 谈谈gitlabce不一样的logo
    GitLab是一个强大的开源代码托管平台,它为开发人员提供了一种免费、简便的方式来管理其源代码,并为协作开发提供了许多的工具和功能。不过,早在2020年5月,GitLab宣布了一些重要的变化。其中一个最受关注的变化之一是GitLab的Log...
    99+
    2023-10-22
  • 浅谈MySQL next-key lock 加锁范围
    前言 某天,突然被问到 MySQL 的 next-key lock,我瞬间的反应就是: 这都是啥啥啥??? 这一个截图我啥也看不出来呀? 仔细一看,好像似曾相识,这不是《MySQL 45 讲》里面的内容么? 什么...
    99+
    2022-06-01
    MySQL next-key lock 加锁范围 MySQL next-key lock
  • 浅谈Java锁机制
    目录1、悲观锁和乐观锁2、悲观锁应用3、乐观锁应用4、CAS5、手写一个自旋锁1、悲观锁和乐观锁 我们可以将锁大体分为两类: 悲观锁 乐观锁 顾名思义,悲观锁总是...
    99+
    2024-04-02
  • 谈一谈Oracle11gR2的审计管理
    谈一谈Oracle11gR2的审计管理作者:赵全文 网名:guestart  在Oracle数据库的安全特性当中,审计被作为特别重要的一个方面。数据库的审计功能主要是用来审计各种类型的DDL和DM...
    99+
    2024-04-02
  • 浅谈一下Java中的悲观锁和乐观锁
    目录悲观锁(Pessimistic Locking)悲观锁存的问题:乐观锁乐观锁存在的问题悲观锁和乐观锁的对比总结悲观锁和乐观锁是面试高频问题之一,本文将对悲观锁和乐观锁简单的进行一...
    99+
    2023-05-16
    Java悲观锁 Java乐观锁
  • 谈谈MySQL中的隐式转换
    工作过程中会遇到比较多关于隐式转换的案例,隐式转换除了会导致慢查询,还会导致数据不准。本文通过几个生产中遇到的案例来。 基础知识 关于比较运算的原则,MySQL官方文档的描述: https://dev.mysql.c...
    99+
    2022-05-25
    MySQL 转换 MySQL 隐式转换
  • 简单谈一谈Vue中render函数
    目录那如何证明?如何解决?那我们为什么不采用报错提示中的第二种方式引入完整的vue呢?补充:vue2 小例子总结: 首先我们引入的vue并不是一个完整的,而是残缺版的vue(没有模板...
    99+
    2024-04-02
  • 浅谈Java由于不当的执行顺序导致的死锁
    我们来讨论一个经常存在的账户转账的问题。账户A要转账给账户B。为了保证在转账的过程中A和B不被其他的线程意外的操作,我们需要给A和B加锁,然后再进行转账操作, 我们看下转账的代码: ...
    99+
    2024-04-02
  • MySQL死锁
    https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html 什么是mysql的死锁? A deadlock is a situation where differen...
    99+
    2014-12-11
    MySQL死锁
  • 浅谈Mybatis乐观锁插件
    背景:对于数据库的同一条记录,假如有两个人同时对数据进行了修改,然后最终同步到数据库的时候,因为存在着并发,产生的结果是不可预料的。最简单的解决方式就是通过给表的记录加一个version字段,记录在修改的时候需要比较一下version是否匹...
    99+
    2023-05-30
    mybatis 乐观锁 插件
  • 详细谈谈MYSQL中的COLLATE是什么
    前言 在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: CREATE TABLE `table1` ( `id`...
    99+
    2022-05-22
    mysql collate mysql collate是什么意思
  • 简单谈谈Mysql索引与redis跳表
    摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别。这种一看就知道是死记硬背,没有理解索引的本质。本文旨在剖析这背后的...
    99+
    2024-04-02
  • 浅谈MySQL函数
    目录1、数学函数2、字符串函数3、日期函数4、加密函数 主要MySQL函数介绍又以下: 数学函数 字符串函数 时间函数 加密函数 ...
    99+
    2024-04-02
  • 浅谈C++11中的几种锁
    目录互斥锁(mutex)条件锁(condition_variable)自旋锁(不推荐使用)递归锁(recursive_mutex)互斥锁(mutex) 可以避免多个线程在某一时刻同时...
    99+
    2024-04-02
  • 浅谈C#数组(一)
    目录一.简单数组之一维数组   1.数组的声明   2.数组的初始化3.访问数组元素4.数组中使用引用类型二.多维数组三.锯齿数组四.Array类1.创建数组2.复制数组3.排序五....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作