清除事务死锁?

时间:2011-03-28 16:43:59

标签: 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)

3 个答案:

答案 0 :(得分:21)

给出一些'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

你想做什么

KILL QUERY 771

杀死死锁的两个查询中的一个。这会杀死查询,但保持连接打开。如果你想杀死连接,那么你可以KILL 197

答案 1 :(得分:7)

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

答案 2 :(得分:7)

  

使用'显示引擎innodb状态'我看到wordpress有两个死锁...关于如何解决这个问题的建议?

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

show engine innodb status;

这会吐出大量的信息。相关部分位于TRANSACTIONS部分。在您的输出中,相关问题似乎是:

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

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

kill 12505095

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

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

---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

我们会查找2 lock struct(s)ACTIVE 21 sec消息。