BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #7649同步于 2013/8/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

【求助】一个mysql发生死锁的问题

watershed
2013/8/19镜像同步3 回复
数据库环境是mysql5和hibernate3.3.2 多个线程并发更新同一张表时发生死锁 表结构为: CREAT TABLE 't_gs_config' { 'serverId'' int(11), 'activityId' int(11), 'name' varchar(255), PRIMARY KEY(`serverId`, `activityId`) } ENGINE=InnoDB DEFAULT CHARSET=utf8; 用的是联合主键serverId和activityId。 猜测当时场景为,表t_gs_config的内容为 serverId activityId name 41 40 s11 42 40 s22 43 40 s13 75 45 s75 76 45 s76 77 45 s77 session1: delete from t_gs_config where activityId=37; session2: insert into t_gs_config (name, activityId, serverId) values ('s70', 44, 70); insert into t_gs_config (name, activityId, serverId) values ('s71', 44, 71); insert into t_gs_config (name, activityId, serverId) values ('s72', 44, 72); 程序中session1对应一个简单的删除操作,session2对应一个批量插入数据的操作。 SHOW INNODB STATUS 的结果如下: OS WAIT ARRAY INFO: reservation count 35764, signal count 33602 Mutex spin waits 0, rounds 1470116, OS waits 17851 RW-shared spins 11703, OS waits 5177; RW-excl spins 22364, OS waits 8975 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 130815 0:00:29 *** (1) TRANSACTION: TRANSACTION 0 801846, ACTIVE 0 sec, process no 23665, OS thread id 1172085056 fetching rows mysql tables in use 1, locked 1 LOCK WAIT 4 lock struct(s), heap size 1216, 26 row lock(s) MySQL thread id 213595, query id 7789690 127.0.0.1 ms_admin updating delete from t_gs_config where activityId=37 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 331 n bits 120 index `PRIMARY` of table `tr`.`t_gs_config` trx id 0 801846 lock_mode X waiting Record lock, heap no 33 PHYSICAL RECORD: n_fields 9; compact format; info bits 0 0: len 4; hex 80000436; asc 6;; 1: len 4; hex 8000002c; asc ,;; 2: len 6; hex 0000000c3c35; asc <5;; 3: len 7; hex 80000001bf0110; asc ;; 4: len 6; hex 202d20783738; asc - x78;; 5: len 4; hex 80000000; asc ;; 6: len 4; hex 80000000; asc ;; 7: len 4; hex 80000000; asc ;; 8: len 4; hex 80000000; asc ;; *** (2) TRANSACTION: TRANSACTION 0 801845, ACTIVE 0 sec, process no 23665, OS thread id 1103411520 inserting, thread declared inside InnoDB 500 mysql tables in use 1, locked 1 3 lock struct(s), heap size 368, 2 row lock(s), undo log entries 1 MySQL thread id 213579, query id 7789700 127.0.0.1 ms_admin update insert into t_gs_config (name, activityId, serverId) values ('s71', 44, 71) *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 0 page no 331 n bits 120 index `PRIMARY` of table `tr`.`t_gs_config` trx id 0 801845 lock_mode X locks rec but not gap Record lock, heap no 33 PHYSICAL RECORD: n_fields 9; compact format; info bits 0 0: len 4; hex 80000436; asc 6;; 1: len 4; hex 8000002c; asc ,;; 2: len 6; hex 0000000c3c35; asc <5;; 3: len 7; hex 80000001bf0110; asc ;; 4: len 6; hex 202d20783738; asc - x78;; 5: len 4; hex 80000000; asc ;; 6: len 4; hex 80000000; asc ;; 7: len 4; hex 80000000; asc ;; 8: len 4; hex 80000000; asc ;; *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 331 n bits 120 index `PRIMARY` of table `tr`.`t_gs_config` trx id 0 801845 lock_mode X locks gap before rec insert intention waiting Record lock, heap no 33 PHYSICAL RECORD: n_fields 9; compact format; info bits 0 0: len 4; hex 80000436; asc 6;; 1: len 4; hex 8000002c; asc ,;; 2: len 6; hex 0000000c3c35; asc <5;; 3: len 7; hex 80000001bf0110; asc ;; 4: len 6; hex 202d20783738; asc - x78;; 5: len 4; hex 80000000; asc ;; 6: len 4; hex 80000000; asc ;; 7: len 4; hex 80000000; asc ;; 8: len 4; hex 80000000; asc ;; *** WE ROLL BACK TRANSACTION (2) ------------ TRANSACTIONS ------------ Trx id counter 0 802503 Purge done for trx's n:o < 0 802455 undo n:o < 0 0 History list length 37 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 0, not started, process no 23665, OS thread id 1167026496 MySQL thread id 214325, query id 7803328 localhost ms_admin 哪位大侠解答一下,很是迷茫。。。。。 谢谢啦!!!
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
byr008机器人#1 · 2013/9/26
没细看,但是表建得不合理,另外拿一个列id来做主键比较好
shiclark机器人#2 · 2013/10/6
我也觉得是表本身的问题呢
watershed机器人#3 · 2013/10/10
双主键确实不太好,但是老代码没辙。。。 肯定是多线程并发更新导致的死锁,我就是没搞清楚,mysql在delete和insert操作时到底是怎么加锁的 【 在 byr008 的大作中提到: 】 : 没细看,但是表建得不合理,另外拿一个列id来做主键比较好