如何解决:Deadlock found when trying to get lock; try restarting transaction

野生散养程序猿 2016-09-02 11:49:51
逻辑:对某个对象的创建做压力测试,执行sql是在多线程下。

表结构如下:
CREATE TABLE `object` 
(
`id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '唯一ID',
`tid` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '配置表的ID',
`userID` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户唯一ID',
`num` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '数量',
PRIMARY KEY (`id`),
UNIQUE KEY `object_uk` (`userID`, `tid`),
INDEX (`userID`)
) ENGINE = InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';


代码会多次批量的执行如下sql语句:
INSERT INTO `object` SET `id`=?, `tid`=?, `role_uid`=?, `num`=? \
ON DUPLICATE KEY UPDATE `id`=?, `tid`=?, `role_uid`=?, `num`=?;


结果,有概率的会抛出异常:Deadlock found when trying to get lock; try restarting transaction
但出现的几率非常小,现在就出现了一次,后面在测试就没有遇到了

请教一下,如何修改可以避免这种情况发生?
...全文
3318 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
查询发现: ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2016-08-31 01:00:32 0x7f37f3bef700 *** (1) TRANSACTION: TRANSACTION 790177, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 MySQL thread id 5675, OS thread handle 139878293034752, query id 8620886 192.168.1.72 root update INSERT INTO `item` SET `uid`=?, `tid`=?, `role_uid`=?, `num`=?, `weared`=? ON DUPLICATE KEY UPDATE `uid`=?, `tid`=?, `role_uid`=?, `num`=?, `weared`=? *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 1344 page no 4 n bits 72 index UK_ITEM of table `sg_game_wsy`.`item` trx id 790177 lock_mode X locks gap before rec insert intention waiting Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 8; hex 010000010000000c; asc ;; 1: len 4; hex 00018705; asc ;; 2: len 8; hex 08002014370b0027; asc 7 ';; *** (2) TRANSACTION: TRANSACTION 790164, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 6 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 1 MySQL thread id 5674, OS thread handle 139878289307392, query id 8620836 192.168.1.72 root update INSERT INTO `item` SET `uid`=?, `tid`=?, `role_uid`=?, `num`=?, `weared`=? ON DUPLICATE KEY UPDATE `uid`=?, `tid`=?, `role_uid`=?, `num`=?, `weared`=? *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 1344 page no 4 n bits 72 index UK_ITEM of table `sg_game_wsy`.`item` trx id 790164 lock_mode X locks gap before rec Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 8; hex 010000010000000c; asc ;; 1: len 4; hex 00018705; asc ;; 2: len 8; hex 08002014370b0027; asc 7 ';; *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 1344 page no 4 n bits 72 index UK_ITEM of table `sg_game_wsy`.`item` trx id 790164 lock_mode X locks gap before rec insert intention waiting Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 8; hex 010000010000000c; asc ;; 1: len 4; hex 00018705; asc ;; 2: len 8; hex 08002014370b0027; asc 7 ';; *** WE ROLL BACK TRANSACTION (1)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧