MySQL死锁 - 访问不同的主键值也会造成死锁

时间:2015-02-23 06:16:22

标签: mysql multithreading sql-update sql-delete

我浏览了MySQL日志并找到了死锁的原因

第一个帖子正在尝试执行以下查询。等待线程2。

UPDATE M_SAMP SET FLAG=0 WHERE M_ID IN (SELECT M_ID FROM MM_RVW_SAMP WHERE TARGET_M_ID IN(19))

内部查询(SELECT M_ID FROM MM_RVW_SAMP WHERE TARGET_M_ID IN(19))的结果是M_ID = 3562

第二个帖子正在查询下方执行。

DELETE FROM M_SAMP WHERE M_ID=3455

在M_SAMP和MM_RVW_SAMP表中定义了no foreign key关系。 M_ID是M_SAMP表的主键。引擎是InnoDB。这个问题正在重复。

任何人都可以帮助我,因为发生死锁会如何授予锁定?

日志

------------------------
LATEST DETECTED DEADLOCK
------------------------
2015-02-23 10:52:28 de8
*** (1) TRANSACTION:
TRANSACTION 13275344, ACTIVE 0 sec fetching rows
mysql tables in use 2, locked 2
LOCK WAIT 25 lock struct(s), heap size 2408, 1394 row lock(s), undo log entries 1
MySQL thread id 1455, OS thread handle 0x11ac, query id 39660 xyz 192.168.1.108 userName Sending data
UPDATE M_SAMP SET FLAG=0 WHERE M_ID IN (SELECT M_ID FROM MM_RVW_SAMP WHERE TARGET_M_ID IN(19))
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 61569 page no 65 n bits 176 index `PRIMARY` of table `dbName`.`m_samp` trx id 13275344 lock_mode X waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 29; compact format; info bits 0

*** (2) TRANSACTION:
TRANSACTION 13275335, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
254 lock struct(s), heap size 27512, 21595 row lock(s), undo log entries 7
MySQL thread id 1458, OS thread handle 0xde8, query id 39664 xyz 192.168.1.108 userName updating
DELETE FROM M_SAMP WHERE M_ID=3455
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 61569 page no 65 n bits 176 index `PRIMARY` of table `dbName`.`m_samp` trx id 13275335 lock mode S locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 29; compact format; info bits 0

谢谢。

1 个答案:

答案 0 :(得分:0)

我的问题的答案由@jynus给出here (on dba.stackexchange)

现在我正在使用以下更新查询。

UPDATE M_SAMP M 
JOIN MM_RVW_SAMP MM 
ON M.M_ID = MM. M_ID 
SET M.FLAG = 1 
WHERE MM.TARGET_M_ID = 19;