清除事务死锁?

eth*_*nny 16 mysql deadlock

使用'show engine innodb status'我看到wordpress有两个死锁.我想清除这些,但我没有看到这些cmds中的任何一个的活动进程(IE某些东西要'杀'并希望强制回滚).

我可以看到线程ID,查询ID等,但我无法用来阻止任何一项工作.

关于如何解决这个问题的建议?

编辑:这是状态的(相关?)部分:

------------------------
LATEST DETECTED DEADLOCK
------------------------
110327 10:54:14
*** (1) TRANSACTION:
TRANSACTION 9FBA099E, ACTIVE 0 sec, process no 14207, OS thread id 1228433728 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 12505112, query id 909492800 juno....edu 129....54 wordpress_user updating
DELETE FROM wp_options WHERE option_name = ''_site_transient_timeout_theme_roots''
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 4951009 page no 4 n bits 384 index `option_name` of table `wordpress_work`.`wp_options` trx id 9FBA099E lock_mode X waiting
Record lock, heap no 309 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 30; hex 5f736974655f7472616e7369656e745f74696d656f75745f7468656d655f; asc _site_transient_timeout_theme_; (total 35 bytes);
1: len 8; hex 0000000000002b6d; asc       +m;;

*** (2) TRANSACTION:
TRANSACTION 9FBA0995, ACTIVE 0 sec, process no 14207, OS thread id 1230031168 starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1248, 2 row lock(s)
MySQL thread id 12505095, query id 909492789 juno....edu 129.....54 wordpress_user updating
DELETE FROM wp_options WHERE option_name = ''_site_transient_timeout_theme_roots''
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 4951009 page no 4 n bits 384 index `option_name` of table `wordpress_work`.`wp_options` trx id 9FBA0995 lock_mode X locks rec but not gap
Record lock, heap no 309 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 30; hex 5f736974655f7472616e7369656e745f74696d656f75745f7468656d655f; asc   _site_transient_timeout_theme_; (total 35 bytes);
 1: len 8; hex 0000000000002b6d; asc       +m;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 4951009 page no 4 n bits 384 index `option_name` of table     `wordpress_work`.`wp_options` trx id 9FBA0995 lock_mode X waiting
Record lock, heap no 309 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 30; hex 5f736974655f7472616e7369656e745f74696d656f75745f7468656d655f; asc   _site_transient_timeout_theme_; (total 35 bytes);
1: len 8; hex 0000000000002b6d; asc       +m;;

*** WE ROLL BACK TRANSACTION (1)
Run Code Online (Sandbox Code Playgroud)

Mar*_*c B 20

鉴于一些'innodb status'输出如下:

---TRANSACTION 0 0, not started, process no 1024, OS thread id 140386055603968
MySQL thread id 197, query id 771 localhost marc
show innodb status
Run Code Online (Sandbox Code Playgroud)

你想做的

KILL QUERY 771
Run Code Online (Sandbox Code Playgroud)

杀死死锁的两个查询中的一个.这会杀死查询,但保持连接打开.如果你想杀死连接,那你就做了KILL 197.

  • 这个答案是错的.死锁检测是"即时的",当记录时,不再需要执行任何操作.本节仅供参考. (4认同)
  • 我遇到了类似的情况.它不是关于`show`命令语法.由于`show processlist`没有显示任何与这些查询相关的连接,这意味着这些死锁事务保留在存储引擎的级别,而不是MySQL API的级别.我发现解决这类问题的唯一方法是重启MySQL的服务. (3认同)
  • 你应该杀死'MySQL thread id',在这个例子中是197。 (3认同)
  • 这应该是在较新版本的mysql中的`show engine innodb status`,我在5.6.10并且`show innodb status`不是一个有效的命令. (2认同)
  • @jkavalik在极少数情况下,持有锁的线程可能会无限期挂起,并且需要在再次释放锁之前手动终止。这不是死锁中通常发生的情况,但除了死锁本身之外,我还遇到过这种情况。 (2认同)

Gra*_*ray 10

使用'show engine innodb status'我看到wordpress有两个死锁......关于如何解决这个问题的建议?

我想我会提供更多可以帮助我们解决类似问题的信息.我们看到Java hibernate问题导致卡住锁定.我们通过梳理输出来找到锁:

show engine innodb status;
Run Code Online (Sandbox Code Playgroud)

这吐出了大量的信息.相关部分在该TRANSACTIONS部分中.在您的输出中,相关问题似乎是:

3 lock struct(s), heap size 1248, 2 row lock(s)
MySQL thread id 12505095, query id 909492789 juno....edu 129.....54 
Run Code Online (Sandbox Code Playgroud)

对我们来说,# lock struct(s)这表明卡住了.要杀死它,你需要使用指定的"线程ID#"执行 - 在这种情况下:

kill 12505095
Run Code Online (Sandbox Code Playgroud)

这适用于AWS MySQL RDS以及本地MySQL.

在我们的TRANSACTIONS部分中,我们还会看到以下内容:

---TRANSACTION 644793773, ACTIVE 21 sec
2 lock struct(s), heap size 360, 1 row lock(s)
MySQL thread id 217, OS thread handle 0x2aef097700, query id 10177 1.3.5.7 mpsp cleaning up
Run Code Online (Sandbox Code Playgroud)

我们寻找2 lock struct(s)ACTIVE 21 sec消息.


Geo*_*man 7

我知道这是旧的,但通常当你看到这样的事情时,这是因为发生了死锁并且触发死锁的应用程序早已移动 - 死锁的受害者得到警告并且失败,或者记录错误或重试,无论哪种方式都转向了其他富有成效的事物.除了查看死锁原因之外,通常不需要做任何其他事情,如果您正在编写软件,请尝试避免将来的死锁.如果您只是使用该软件(例如,如果您不在Wordpress上工作,请使用Wordpress),您可以将死锁报告为可能的错误.