当前位置: 首页 > 知识库问答 >
问题:

MySQL死锁:Engine.log analyze

方建明
2023-03-14

如何理解死锁的原因--即,如何找出哪些事务捕获了哪些锁?

我的Engine.log文件存在以下死锁:

------------------------
LATEST DETECTED DEADLOCK
------------------------
170327 11:09:53
*** (1) TRANSACTION:
TRANSACTION 4 2719072253, ACTIVE 5 sec, OS thread id 26215 starting index read
...
INSERT INTO... (the first transaction)

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 36025889 n bits 96 index `PRIMARY` of table `mydb`.`mytable` trx id 4 2719072253 lock mode S locks rec but not gap waiting

...
*** (2) TRANSACTION:
TRANSACTION 4 2719072205, ACTIVE 35 sec, OS thread id 25564 starting index read, thread declared inside InnoDB 485

UPDATE ... (the second transaction)

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 36025889 n bits 96 index `PRIMARY` of table `mydb`.`mytable` trx id 4 2719072205 lock_mode X locks rec but not gap
Record lock, heap no 27 PHYSICAL RECORD: n_fields 72; compact format; info bits 0
...

 *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
 RECORD LOCKS space id 0 page no 42767646 n bits 120 index `PRIMARY` of table `mydb`.`mytable` trx id 4 2719072205 lock_mode X locks rec but not gap waiting

...

 *** WE ROLL BACK TRANSACTION (1)

我对日志中描述的内容的看法如下:

***(2)保持锁

记录锁空间id 0页号36025889 n位96表MYDB.MYTABLE trx id 4 271 9072205锁模式X锁rec,但不锁gap

记录锁,堆第27号物理记录:N_Fields72;紧凑格式;信息位0

***(1)等待授予此锁:

记录锁定...trx id 4 271 9072253锁定模式S锁定rec但不是间隙等待

尝试失败后,开始等待事务2号锁的解除;

3.然后事务2尝试获得X类型的锁:

***(2)等待授予此锁:

记录锁...trx id 4 271 9072205 lock_mode X锁rec,但不是间隙等待

尝试失败后,它开始等待,直到事务1获得S锁并释放它。

我是否正确理解日志,或者我的解释是错误的?

共有1个答案

盖向荣
2023-03-14

摘录没有告诉我们是什么事务锁定了第二个事务正在等待的记录。我们只能假设这是第一次交易--否则就不会是死锁。

 类似资料:
  • 死锁概念 死锁(Deadlock)就是一个进程拿着资源A请求资源B,另一个进程拿着资源B请求资源A,双方都不释放自己的资源,导致两个进程都进行不下去。 示例程序 我们可以写代码模拟进程死锁的例子。 package main func main() { ch := make(chan int) <-ch } 运行结果 root@fa13d0439d7a:/go/src# go run de

  • 表以作为主键,列(CHAR(1))可以是“x”或“y”,以及(INT)。这些列上没有索引。存储引擎是InnoDB。 state_positions必须总是连续的,并且对于某个状态可能永远不会有重复的位置,即如果我有5个状态为“x”的用户,他们的state_positions必须是1、2、3、4、5 这是我正在运行的导致死锁的查询: 为了测试,我同时插入了大量的用户,但每次都出现死锁错误。 我读了这

  • 问题内容: 我通过“ SHOW INNODB STATUS”收到了以下死锁日志。有人可以解释一下为什么交易被中止吗?似乎事务2持有该锁,但也卡住以请求相同的锁(“等待”部分除外),当事务1也需要它时,这将导致死锁。 问题答案: 第一步是确定两个查询是什么: SELECT API_KEY,完成,创建,删除,标记,,GROUP_ID,主机名,,JID,标签,语言,优先,,重新启动,状态,类型,UID,

  • 本文向大家介绍互斥锁死锁,包括了互斥锁死锁的使用技巧和注意事项,需要的朋友参考一下 死锁可以在使用互斥锁的多线程Pthread程序中发生。让我们看看它如何发生。未锁定的互斥锁由pthread_mutex_init()函数初始化。 使用pthread_mutex_lock()和pthread_mutex_unlock()获取并释放互斥锁。如果线程尝试获取锁定的互斥锁,则对pthread_mutex_

  • 主要内容:死锁避免,死锁检测,等待图,死锁预防,等待模式,创伤等待模式死锁是两个或多个事务无限期地等待彼此放弃锁定的情况。 死锁被认为是DBMS中最令人恐惧的并发症之一,因为任务都没有完成,并且永远处于等待状态。 例如: 在表中,事务T1对某些行进行锁定,需要更新表中的某些行。 同时,事务T2在等级表中的某些行上保持锁定,并且需要更新事务T1持有的表中的行。 现在,出现了问题。事务T1正在等待T2释放其锁定,同样,事务T2正在等待T1释放其锁定。 所有活动都陷入停顿

  • 原因: 竞争资源 程序推进顺序不当 必要条件: 互斥条件 请求和保持条件 不剥夺条件 环路等待条件 处理死锁基本方法: 预防死锁(摒弃除1以外的条件) 避免死锁(银行家算法) 检测死锁(资源分配图) 解除死锁 剥夺资源 撤销进程 死锁概念处理策略详细介绍:https://wizardforcel.gitbooks.io/wangdaokaoyan-os/content/10.html