mysql并发插入引起的死锁
这两天大数据有个mysql实例经常产生死锁报警,查了网上的很多文档,明白了个大概,但是网上很多分享都是两个事务操作同一条记录,这个产生死锁很好理解,但是我查看了错误日志后,发现是两条不同的insert语句,有着不同的主键产生了死锁,一直理解不了为什么,两个事务在insert两条不同的记录也会产生死锁,当前的MySQL版本是5.6的,事务隔离级别是RR,自己想了好几天,还是很困惑。请求大牛们指教。
表结构如下:
CREATE TABLE `realtime_xueke_study_lesson` (
`daytime` bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘时间戳’,
`userid` bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘用户id’,
`lesson_id` bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘课程id’,
`type` tinyint(4) NOT NULL DEFAULT ‘0’,
`v_time` double NOT NULL DEFAULT ‘0’ COMMENT ‘观看时长(秒)’,
`video_time` double NOT NULL DEFAULT ‘0’ COMMENT ‘视频时长’,
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`utime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`flag` tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘区分不同的topic。1,2,3’,
PRIMARY KEY (`daytime`,`userid`,`lesson_id`,`type`) USING BTREE,
KEY `idx_userid` (`userid`),
KEY `idx_lessonid` (`lesson_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
报错信息如下:
2018-09-03 07:19:07 7fd8339c8700InnoDB: transactions deadlock detected, dumping detailed information.
2018-09-03 07:19:07 7fd8339c8700
*** (1) TRANSACTION:
TRANSACTION 3466549211, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 18 lock struct(s), heap size 2936, 17 row lock(s), undo log entries 20
MySQL thread id 7760242, OS thread handle 0x7fd72dcba700, query id 1607314748 x.x.x.x bigdata_user update
INSERT INTO realtime_xueke_study_lesson (userid,lesson_id,v_time,daytime,type,flag) VALUES (10316873,14106,5.48,1535904000000,1,6) ON DUPLICATE KEY UPDATE v_time = 5.48,flag = 6
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 43898 page no 37589 n bits 280 index `PRIMARY` of table `data_report`.`realtime_xueke_study_lesson` trx id 3466549211 lock_mode X locks rec but not gap waiting
*** (2) TRANSACTION:
TRANSACTION 3466549210, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
12 lock struct(s), heap size 2936, 12 row lock(s), undo log entries 13
MySQL thread id 7745349, OS thread handle 0x7fd8339c8700, query id 1607314751 x.x.x.x bigdata_user update
INSERT INTO realtime_xueke_study_lesson (userid,lesson_id,v_time,daytime,type,flag) VALUES (13631301,15055,9.559,1535904000000,1,6) ON DUPLICATE KEY UPDATE v_time = 9.559,flag = 6
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 43898 page no 37589 n bits 280 index `PRIMARY` of table `data_report`.`realtime_xueke_study_lesson` trx id 3466549210 lock_mode X locks rec but not gap
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 43898 page no 34727 n bits 216 index `PRIMARY` of table `data_report`.`realtime_xueke_study_lesson` trx id 3466549210 lock_mode X locks rec but not gap waiting
*** WE ROLL BACK TRANSACTION (2)