首先,其实造成死锁的可能性也许每个人都不一样,所以重点不是如何解决问题,而是分析,也许我遇到的问题并不适用于其他人,但是遇到这种情况先要搞清楚,是哪个表,的哪个字段产生了资源征用,然后分析解决就可以了。
登录mysql后,通过show engine innodb status;来查看最后一次死锁的情况
查询后显示的
------------------------
LATEST DETECTED DEADLOCK
------------------------
块下面就是死锁的征用描述信息
里面会描述事物1、事物2....在执行某一语句的时候,对哪一个表的哪一个字段进行征用资源的时候,被什么类型的锁占用了
比如如下信息
RECORD LOCKS space id 47 page no 305 n bits 328 index PRIMARY of table `test`.`t_test` trx id 13806 lock_mode X locks gap before rec insert intention waiting
这里描述了
锁的类型,RECORD,锁得模式X,在准备申请插入意向锁的时候,在PRIMARY主键索引所在的空间47 页号305的328位的位置上产生了征用。
这里就要先熟悉几个概念
锁模式,X代表排它锁,S代表共享锁,IX代表表级排他锁,IS代表表级共享锁,他们之间在多线程/会话/事务的情况下,有可能同时使用,具体兼容关系可以参看官方文档
http://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html
锁的类型也在上面的文档里有描述
RECORD 为记录级锁
GAP为记录区间范围的锁
Next-Key Locks为大于值,小于等于某个值的区间范围的锁
这些指的都是索引,其实也就是在操作表数据的时候,会先将索引锁住,尤其是PRIMARY和UNIQUE,这种唯一约束的索引,在操作的时候,数据库都会先查询数据库中的索引然后再进行相应操作。
了解了这些我们就可以分析,锁的资源征用情况
比如如下操作
表模型为
主键(自增,有主键索引)
其他列
开始事务1
事务1,执行delete语句删除某一个存在的值(锁住这条记录的索引)
事务1,插入一条新的记录,申请锁,等待这个锁被授权
开始事务2
事务2,执行delete语句删除某一个与事务1不同的存在的值(锁住这条记录的索引)
事务2,插入一条新的记录,申请锁,等待这个锁被授权
提交事务1
提交事务2
以上的操作不会造成资源竞争,因为两条delete删除的是指定的id的值。
但是当上面的操作,如果delete删除某一个不存在的值,那么就会将这个不存在的索引在所有索引里面去找,会找到一个区间范围,比如索引是10,20,要删除15,那么就会将索引10~20的范围进行锁死,而与此同时,另外一个事务也要锁这个区间范围,就会造成资源竞争。
两个事务的insert都在等待delete锁定的区间范围释放,然后执行插入,这样就造成了死锁
当然以上的只是其中一种情况,造成死锁的原因就是资源竞争,所以先查清楚哪个资源被竞争,执行哪一条语句时造成可,以及表的结构是怎样的很重要。
分享到:
相关推荐
这篇博客文章《mysql死锁的一些案例》可能深入探讨了MySQL中死锁的产生原因、表现形式以及解决策略。虽然具体内容未给出,但我们可以根据通常的死锁情况来进行分析。 1. **死锁产生的原因**: - 资源请求顺序不同...
在 MySQL 中,死锁检测机制是一种重要的机制,用于检测和解决事务之间的死锁问题。在本文中,我们将详细介绍 MySQL 死锁检测机制的原理和实现。 一、死锁的定义和原理 在 MySQL 中,死锁是指两个或两个以上的事务...
对于MySQL/InnoDB数据库而言,了解死锁的产生机制、分析死锁的方法以及如何预防死锁是非常重要的。 #### 一个不可思议的死锁 假设有一个表`dltask`,其结构如下: ```sql CREATE TABLE dltask ( id bigint ...
然而,如果表中有唯一索引,即使在RC级别,也可能因Next-Key Lock的存在而产生锁定,阻止并发。这是因为当插入的数据违反唯一性约束时,MySQL会尝试设置一个共享锁(S Lock)在冲突的唯一索引记录上,以防止其他事务...
MySQL的InnoDB存储引擎在处理并发事务时可能会遇到死锁问题,这主要发生在多个事务互相等待对方释放资源的情况下。死锁通常由四个必要条件引发: 1. 互斥条件:资源只能被一个事务使用。 2. 请求和保持条件:一个...
本文将详细介绍MySQL中的死锁现象、其产生的原因以及如何有效地检测与解决死锁问题。 #### 一、死锁定义 死锁是指两个或两个以上的事务在执行过程中,由于每个事务都持有某些资源且又都在等待其他事务释放其持有的...
MySQL数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。了解和处理死锁是数据库管理员和开发人员必备的技能。...
解决MySQL中的死锁问题通常涉及多个方面,包括监控死锁、分析死锁原因、优化事务设计以及调整系统配置等。以下是一些解决MySQL中死锁问题的建议和方法: 监控死锁: 使用SHOW ENGINE INNODB STATUS命令来查看InnoDB...
MySQL中的死锁问题是一个复杂而微妙的议题,尤其是在数据库优化和并发控制中。本文将深入探讨一个看似不可能发生的死锁案例,并分析其背后的原理。死锁通常发生在多个事务相互等待对方释放资源的情况下,但在这个...
本文将探讨MySQL死锁的产生原因以及解决方案。 **死锁的产生原因** 1. **资源竞争与顺序依赖**:当两个事务A和B分别持有对方需要的资源,A等待B释放资源,B也在等待A释放资源,就会形成死锁。例如,事务A锁定表A后...
InnoDB引擎通过死锁检测机制来识别并解决这类问题,但了解死锁产生的原因能帮助我们更好地避免它们。 二、不常见死锁情况1:索引顺序不同 当两个事务分别按照不同的顺序访问同一组资源时,可能会导致死锁。例如,...
这个实验的目标是让学生深入理解死锁的产生,以及学习如何解决死锁问题。 实验报告中提到了使用管程和条件变量作为解决死锁的机制。管程是一种高级的进程同步工具,由英国计算机科学家C.A.R. Hoare提出,它提供了一...
前段时间遇到了一个Mysql 死锁相关的问题,整理一下。 问题描述:Mysql 的修改语句似乎都没有生效,同时使用Mysql GUI 工具编辑字段的值时会弹出异常。 什么是死锁 在解决Mysql 死锁的问题之前,还是先来了解一下...
死锁的产生原因是由于两个或两个以上的 Session 加锁的顺序不一致。解决死锁问题的关键就是让不同的 Session 加锁有次序。 MySQL 中有三种锁的级别:页级、表级、行级。表级锁的开销小、加锁快,锁定粒度大,发生锁...
MySQL数据库的死锁问题是一个复杂且常见的挑战,尤其是在高并发的业务环境中。死锁发生在两个或更多的事务相互等待对方释放资源,导致它们无法继续执行。这种情况严重影响系统的性能和用户体验,因此,理解底层源码...
MySQL中的死锁问题是一个常见的事务处理挑战,尤其是在并发操作中。死锁发生时,两个或多个事务互相等待对方释放资源,导致系统无法继续执行。在MySQL的InnoDB存储引擎中,死锁检测机制能自动识别并解决这种情况,...
在实际中,解决MySQL(InnoDB)的死锁问题需要深入了解死锁产生的原因、锁的类型以及加锁策略,进而对业务逻辑进行优化或调整数据库配置和代码逻辑以减少死锁的可能性。 ### 个人简介 何登成作为阿里巴巴DBA团队的...