首先,其实造成死锁的可能性也许每个人都不一样,所以重点不是如何解决问题,而是分析,也许我遇到的问题并不适用于其他人,但是遇到这种情况先要搞清楚,是哪个表,的哪个字段产生了资源征用,然后分析解决就可以了。
登录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数据库之Purge死锁问题解析 MySQL数据库中Purge死锁问题是指在数据库中出现的死锁情况,导致数据库无法继续进行操作。Purge死锁问题是MySQL数据库中的一种常见问题,出现这种问题的原因有多种,例如记录锁、...