我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL是怎么处理死锁的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL是怎么处理死锁的

小编给大家分享一下MySQL是怎么处理死锁的,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、什么是死锁

官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。

这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。

MySQL是怎么处理死锁的

二、为什么会形成死锁

看到这里,也许你会有这样的疑问,事务和谈判不一样,为什么事务不能使用完锁之后立马释放呢?居然还要操作完了之后一直持有锁?这就涉及到 MySQL 的并发控制了。

MySQL的并发控制有两种方式,一个是 MVCC,一个是两阶段锁协议。那么为什么要并发控制呢?是因为多个用户同时操作 MySQL 的时候,为了提高并发性能并且要求如同多个用户的请求过来之后如同串行执行的一样(可串行化调度)。具体的并发控制这里不再展开。咱们继续深入讨论两阶段锁协议。

两阶段锁协议(2PL)

官方定义:

两阶段锁协议是指所有事务必须分两个阶段对数据加锁和解锁,在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;在释放一个封锁之后,事务不再申请和获得任何其他封锁。

对应到 MySQL 上分为两个阶段:

  1. 扩展阶段(事务开始后,commit 之前):获取锁

  2. 收缩阶段(commit 之后):释放锁

就是说呢,只有遵循两段锁协议,才能实现 可串行化调度。

但是两阶段锁协议不要求事务必须一次将所有需要使用的数据加锁,并且在加锁阶段没有顺序要求,所以这种并发控制方式会形成死锁。

三、MySQL 如何处理死锁?

MySQL有两种死锁处理方式:

  1. 等待,直到超时(innodb_lock_wait_timeout=50s)。

  2. 发起死锁检测,主动回滚一条事务,让其他事务继续执行(innodb_deadlock_detect=on)。

由于性能原因,一般都是使用死锁检测来进行处理死锁。

死锁检测

死锁检测的原理是构建一个以事务为顶点、锁为边的有向图,判断有向图是否存在环,存在即有死锁。

回滚

检测到死锁之后,选择插入更新或者删除的行数最少的事务回滚,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段来判断。

四、如何避免发生死锁

收集死锁信息:

  1. 利用命令 SHOW ENGINE INNODB STATUS查看死锁原因。

  2. 调试阶段开启 innodb_print_all_deadlocks,收集所有死锁日志。

减少死锁:

  1. 使用事务,不使用 lock tables 。

  2. 保证没有长事务。

  3. 操作完之后立即提交事务,特别是在交互式命令行中。

  4. 如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),尝试降低隔离级别。

  5. 修改多个表或者多个行的时候,将修改的顺序保持一致。

  6. 创建索引,可以使创建的锁更少。

  7. 最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。

  8. 如果上述都无法解决问题,那么尝试使用 lock tables t1, t2, t3 锁多张表

看完了这篇文章,相信你对“MySQL是怎么处理死锁的”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL是怎么处理死锁的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

处理和优化 MySQL 死锁锁定

很抱歉,由于技术限制,我无法提供具体代码示例。但是我可以帮你提供一个讲解MySQL锁、死锁处理与优化的大纲,供你参考。MySQL 锁的死锁处理与优化一、MySQL锁的分类读锁(共享锁)写锁(排它锁)二、死锁概念什么是死锁死锁产生的条件如何避
处理和优化 MySQL 死锁锁定
2023-12-21

MySQL 死锁了,怎么办?

间隙锁本质上是用于阻止其他事务在该间隙内插入新记录,而自身事务是允许在该间隙内插入数据的。也就是说间隙锁的应用场景包括并发读取、并发更新、并发删除和并发插入。

oracle死锁查询和处理的方法是什么

Oracle数据库提供了多种方法来查询和处理死锁。以下是一些常用的方法:查询死锁:可以使用以下SQL语句查询当前是否存在死锁:SELECT DISTINCT l1.sid || ',' || l1.serial# || ',' || l1.
oracle死锁查询和处理的方法是什么
2024-04-09

Mysql两阶段锁和死锁是什么

本篇内容主要讲解“Mysql两阶段锁和死锁是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql两阶段锁和死锁是什么”吧!两阶段锁概念讲的是InnoDB如何处理行锁的上锁,释放锁的行为。
2022-12-27

mysql死锁怎么复现

死锁是指多个进程互相等待而无法执行的情况。在 mysql 中,死锁通常发生在更新同一行或多行数据时。复现死锁的步骤:创建数据表并插入数据。开启两个事务并设置锁。尝试更新同一行。提交事务。mysql 通过回滚其中一个事务来解决死锁。避免死锁的
mysql死锁怎么复现
2024-05-30

mysql怎么查询死锁的表

要查询死锁的表,可以使用以下步骤:执行以下命令,查看当前的死锁情况:SHOW ENGINE INNODB STATUS;在结果中,查找"InnoDB"部分,找到"LATEST DETECTED DEADLOCK"字样。在该部分下方,会列出
mysql怎么查询死锁的表
2024-04-09

.NET监视程序中死锁怎么处理

这篇文章将为大家详细讲解有关.NET监视程序中死锁怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。监视程序主要是用来监控是否出现死锁等情况,但是这种.NET监视程序一般只能在测试中使用,如果大范围使
2023-06-17

PostgreSQL死锁了怎么办及处理方法

目录什么是数据库死锁如何确定死锁位置死锁的可能原因以及解决办法避免死锁的实战建议解决一:查询pg_stat_activity有没有记录解决二:查询pg_locks是否有这个对象的锁PS:PostgreSQL表死锁问题的排查方式什么是数据库死
2023-01-13

编程热搜

目录