gpt4 book ai didi

MySQL 事务死锁,但 SHOW ENGINE INNODB STATUS 不显示真正的死锁

转载 作者:行者123 更新时间:2023-11-29 03:05:18 26 4
gpt4 key购买 nike

我在 2 个进程修改 MySQL 数据库中的同一个表时遇到了一些麻烦。偶尔它会导致死锁,并且一个或其他进程在尝试获取锁时会出现“发现死锁”;尝试重新启动交易'错误。

我在 stackoverflow 上找到了为什么会出现这种情况的一些答案,这让我找到了解决问题的一些方法。 (只需重试交易)。我希望有比这更好的解决方案,因此开始使用 SHOW ENGINE INNODB STATUS 进行调查。

我对 STATUS 命令的输出感到困惑。据我所知,它并没有显示出真正的僵局。第一个事务正在等待锁定的行购买第二个事务,并且第一个事务没有持有其他锁。第二个事务持有 4 个锁,一个是第一个事务所需的锁,正在等待第 5 个锁。没有提到任何其他事务持有第 5 个锁。

与死锁相关的输出是:

------------------------
LATEST DETECTED DEADLOCK
------------------------
130514 8:54:12
*** (1) TRANSACTION:
TRANSACTION 0 487333931, ACTIVE 0 sec, process no 1007, OS thread id 2990889792 fetching rows
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 320, 24 row lock(s), undo log entries 3
MySQL thread id 774102, query id 166772615 localhost 127.0.0.1 nesie updating
DELETE FROM DeviceStatus WHERE serialNo=1234567 AND subDevice=1 AND (parameter='band' OR parameter='arfcn' OR parameter='txPower' OR parameter='lac' OR parameter='cellId' OR parameter='channel' OR parameter='rxReversePower' OR parameter='reverseSnr' OR parameter='reverseGmp' OR parameter='reverseBepm' OR parameter='mobileHeldOn' OR parameter='mobileHeldBand' OR parameter='mobileTxPower' OR parameter='mobileCommandedPower' OR parameter='rxPathLoss' OR parameter='holdState' OR parameter='band' OR parameter='channel' OR parameter='arfcn' OR parameter='rxForwardPower' OR parameter='forwardSnr' OR parameter='forwardGmp' OR parameter='forwardBepm' OR parameter='lac' OR parameter='cellId')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1267 page no 3 n bits 96 index `PRIMARY` of table `nesie`.`DeviceStatus` trx id 0 487333931 lock_mode X waiting
Record lock, heap no 20 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 4; hex 80151487; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 10; hex 6d6f6e69746f72696e67; asc monitoring;; 3: len 6; hex 00001d0c202a; asc *;; 4: len 7; hex 00000000342dbd; asc 4- ;; 5: len 4; hex 80000000; asc ;;

*** (2) TRANSACTION:
TRANSACTION 0 487333930, ACTIVE 0 sec, process no 1007, OS thread id 3063302976 inserting, thread declared inside InnoDB 488
mysql tables in use 1, locked 1
5 lock struct(s), heap size 320, 6 row lock(s), undo log entries 4
MySQL thread id 774099, query id 166772616 localhost nesie update
REPLACE INTO DeviceStatus VALUES (1381511,1,'scanning',1),(1381511,1,'monitoring',0),(1381511,1,'transmitting',0),(1381511,1,'power',-84),(1381511,1,'band',1),(1381511,1,'uarfcn',10661),(1381511,1,'scramblingCode',377)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1267 page no 3 n bits 96 index `PRIMARY` of table `nesie`.`DeviceStatus` trx id 0 487333930 lock_mode X locks rec but not gap
Record lock, heap no 20 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 4; hex 80151487; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 10; hex 6d6f6e69746f72696e67; asc monitoring;; 3: len 6; hex 00001d0c202a; asc *;; 4: len 7; hex 00000000342dbd; asc 4- ;; 5: len 4; hex 80000000; asc ;;

Record lock, heap no 21 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 4; hex 80151487; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 5; hex 706f776572; asc power;; 3: len 6; hex 00001d0c202a; asc *;; 4: len 7; hex 00000000342e11; asc 4. ;; 5: len 4; hex 7fffffac; asc ;;

Record lock, heap no 22 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 4; hex 80151487; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 8; hex 7363616e6e696e67; asc scanning;; 3: len 6; hex 00001d0c202a; asc *;; 4: len 7; hex 00000000342d96; asc 4- ;; 5: len 4; hex 80000001; asc ;;

Record lock, heap no 24 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 4; hex 80151487; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 12; hex 7472616e736d697474696e67; asc transmitting;; 3: len 6; hex 00001d0c202a; asc *;; 4: len 7; hex 00000000342de6; asc 4- ;; 5: len 4; hex 80000000; asc ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1267 page no 3 n bits 96 index `PRIMARY` of table `nesie`.`DeviceStatus` trx id 0 487333930 lock_mode X locks rec but not gap waiting
Record lock, heap no 17 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 4; hex 80151487; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 4; hex 62616e64; asc band;; 3: len 6; hex 00001d0c19ff; asc ;; 4: len 7; hex 000000003428a7; asc 4( ;; 5: len 4; hex 80000001; asc ;;

*** WE ROLL BACK TRANSACTION (1)

我的问题是:

为什么这被标记为死锁,事务 1 可以排队直到事务 2 完成,因为它没有持有事务 2 所需的锁?

有谁知道这是 MySQL 的正常行为还是一个错误?

谢谢,

西蒙。

最佳答案

您可以使用新的 5.6 变量:http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_print_all_deadlocks

通过这种方式,您将能够记录所有死锁,并可能找到哪个事务正在启动您的死锁。

关于MySQL 事务死锁,但 SHOW ENGINE INNODB STATUS 不显示真正的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16562619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com