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

MySQL死锁问题的分析及解决方法

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

MySQL死锁问题的分析及解决方法

这篇文章主要讲解了“MySQL死锁问题的分析及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁问题的分析及解决方法”吧!

MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下:

1、MySQL常用存储引擎的锁机制

MyISAM和MEMORY采用表级锁(table-level locking)

BDB采用页面锁(page-level locking)或表级锁,默认为页面锁

InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

2、各种锁特点

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率***,并发度***

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率***,并发度也***

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

3、各种锁的适用场景

表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用

行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统

4、死锁

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.

5、死锁举例分析

在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key  locking。

例如,一个表db.tab_test,结构如下:

id:主键;

state:状态;

time:时间;

索引:idx_1 (state, time)

出现死锁日志如下:

***(1) TRANSACTION:  TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starting index read  mysql tables in use 1, locked 1  LOCK WAIT 3 lock struct(s), heap size 320  MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update  update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute) (任务1的sql语句)  ***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任务1等待的索引记录)  RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833455 _mode X locks rec but not gap waiting  Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0  0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;  *** (2) TRANSACTION:  TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499  mysql tables in use 1, locked 1  3 lock struct(s), heap size 320, undo log entries 1  MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating update tab_test set state=1067,time=now () where id in (9921180) (任务2的sql语句)  *** (2) HOLDS THE LOCK(S): (任务2已获得的锁)  RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap  Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0  0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;  *** (2) WAITING FOR THIS LOCK TO BE GRANTED: (任务2等待的锁)  RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap waiting   Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0  0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;  *** WE ROLL BACK TRANSACTION (1)  (回滚了任务1,以解除死锁)

原因分析:

当“update tab_test set state=1064,time=now() where state=1061 and time <  date_sub(now(), INTERVAL 30  minute)”执行时,MySQL会使用idx_1索引,因此首先锁定相关的索引记录,因为idx_1是非主键索引,为执行该语句,MySQL还会锁定主键索引。

假设“update tab_test set state=1067,time=now () where id in  (9921180)”几乎同时执行时,本语句首先锁定主键索引,由于需要更新state的值,所以还需要锁定idx_1的某些索引记录。

这样***条语句锁定了idx_1的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待idx_1的记录,这样死锁就产生了。

6、解决办法

拆分***条sql,先查出符合条件的主键值,再按照主键更新记录:

select id from tab_test where state=1061 and time < date_sub(now(), INTERVAL 30 minute);update tab_test state=1064,time=now() where id in(......);

至此MySQL死锁问题得以解决!

感谢各位的阅读,以上就是“MySQL死锁问题的分析及解决方法”的内容了,经过本文的学习后,相信大家对MySQL死锁问题的分析及解决方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

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

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

MySQL死锁问题的分析及解决方法

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

下载Word文档

猜你喜欢

MySQL死锁解析与解决方法

MySQL死锁解析与解决方法MySQL死锁是指事务等待彼此释放资源导致僵持。InnoDB存储引擎通过死锁检测器检测并回滚一个事务打破死锁。预防死锁包括合理使用锁、缩短事务时长、使用锁超时。解决死锁的方法有:修改应用程序逻辑:检测死锁并重试事务或自动采取措施。调整MySQL配置:设置锁超时、调整死锁检测间隔。优化数据库架构:使用行级锁、建立适当索引、分解大表。监控和分析:监控死锁、分析死锁日志。其他建议包括隔离事务、定期清理死锁、优化服务器硬件。
MySQL死锁解析与解决方法
2024-04-02

MySQL锁等待与死锁问题分析

前言: 在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重。本篇文章我们一起来学习下什么是锁等待及死锁,出现此类问
2022-05-22

SQLServer中排查死锁及死锁问题解决

目录一、背景二、本地模拟死锁1.业务场景简介2.在本地模拟死锁1). 准备数据2).执行存储过程并观察死锁发生三、死锁的详细分析1.查看死锁报告2.分析死锁报告四、解决死锁问题 一、背景我们在UAT环境压测的时候,遇到了如下的死锁异常。
SQLServer中排查死锁及死锁问题解决
2024-08-28

怎么解决MySQL死锁问题的?

死锁是并发系统中常见的问题,同样也会出现在数据库MySQL的并发读写请求场景中。当两个及以上的事务,双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源,就会出现“死锁”。

如何解决MySQL中的死锁问题?

虽然锁在一定程度上能够解决并发问题,但稍有不慎,就可能造成死锁。本文介绍死锁的产生及处理。

解决Windows7网络模式锁死问题的方法

随着Windows7系统的发布,越来越多的用户开始使用windows7系统,虽说windosHIUxws系统的功能大同小异,但是仍有用户在使用windows7的过程中出现这样或那样的问题,下面就是教大家解决Windows7网络模式锁死的方法
2023-05-25

MySQL - 死锁的产生及解决方案

MySQL - 死锁的产生及解决方案 1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件 2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁 3. 死锁排查4. 实例分析
2023-08-17

手把手教你分析MySQL死锁问题

事务1在表1上加了S锁后,事务2想要更改某行记录,需要添加IX锁,由于不兼容,所以需要等待S锁释放;如果事务1在表1上加了IS锁,事务2添加的IX锁与IS锁兼容,就可以操作,这就实现了更细粒度的加锁。

mysql死锁排查及解决的方法是什么

MySQL死锁是指两个或多个事务相互等待对方持有的资源,导致无法继续执行的情况。为了排查和解决MySQL死锁,可以采取以下方法:1. 记录死锁信息:MySQL的日志文件中会记录死锁信息,可以通过查看错误日志或使用SHOW ENGINE IN
2023-08-16

编程热搜

目录