1

目前,我正面临一个问题,结果证明这是我们后端的僵局。为了能够重现该问题,我通过命令“SHOW ENGINE INNODB STATUS;”得到了“最新检测到的死锁”输出。不幸的是,我对此类问题不是很有经验,希望您能帮助我。

*** (1) TRANSACTION:
TRANSACTION 81120, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 8 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 3810, OS thread handle 1740, query id 47722 localhost 127.0.0.1 root update
INSERT IGNORE INTO TableA (a, b, c, d, e) VALUES (null, \'strA\', null, \'strB\', 2)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 446 page no 4 n bits 80 index uniqueIndexName of table `DatabaseName`.`TableA` trx id 81120 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000003; asc     ;;
 1: len 10; hex 323032302d30312d3031; asc strC;;
 2: len 8; hex 8000000000000003; asc         ;;

*** (2) TRANSACTION:
TRANSACTION 81121, ACTIVE 0 sec inserting, thread declared inside InnoDB 5000
mysql tables in use 1, locked 1
8 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 3809, OS thread handle 14824, query id 47723 localhost 127.0.0.1 root update
INSERT IGNORE INTO TableA (a, b, c, d, e) VALUES (null, \'strA\', null, \'strB\', 2)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 446 page no 4 n bits 80 index uniqueIndexName of table DatabaseName.TableA trx id 81121 lock mode S
Record lock, heap no 4 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000003; asc     ;;
 1: len 10; hex 323032302d30312d3031; asc strC;;
 2: len 8; hex 8000000000000003; asc         ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 446 page no 4 n bits 80 index uniqueIndexName of table DatabaseName.TableA trx id 81121 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000003; asc     ;;
 1: len 10; hex 323032302d30312d3031; asc strC;;
 2: len 8; hex 8000000000000003; asc         ;;

如您所见,有两个事务:事务 1 在插入忽略期间等待事务 2 持有的一个锁。但事务 2 持有并等待授予同一个锁......

两个事务都希望插入具有相同唯一索引的同一行。只有一个应该成功,而另一个应该忽略插入。

我希望我为您提供了足够的信息。在此先感谢您的帮助 :)

问候,多云

4

0 回答 0