记一次死锁事故 Deadlock found when trying to get lock

表结构如下:

 

CREATE TABLE `T_QUESTION_ANSWER` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 自增',

  `project_id` int(11) DEFAULT NULL COMMENT '项目id',

  `question_id` int(11) DEFAULT NULL COMMENT '题目id',

  `key` varchar(20) DEFAULT NULL COMMENT '题目编号(如 1.1.2)',

  `value` text COMMENT '填空内容(多选之间用逗号隔开)',

  `score` decimal(18,2) DEFAULT NULL COMMENT '得分',

  `update_date` timestamp NULL DEFAULT NULL COMMENT '更新时间',

  `create_date` timestamp NULL DEFAULT NULL COMMENT '创建时间',

  PRIMARY KEY (`id`),

  UNIQUE KEY `INDEX_UNIQUE` (`project_id`,`question_id`)

) ENGINE=InnoDB AUTO_INCREMENT=49741 DEFAULT CHARSET=utf8mb4 COMMENT='题目答案表'

 

在使用压力工具测试时发现:批量插入时报死锁错误。

 

Deadlock found when trying to get lock

 

百度一下,有答案了。

https://www.xuejiayuan.net/blog/24ca9c92d56446e3a525c47f6617cb6d

 

五、解决方案

修改隔离级别为提交读(RC)

修改业务代码逻辑,删除记录之前,先select,确认该记录存在,再执行delete删除该记录。

 

之前:

//删除旧答案

deleteBy(Util.getSimpleMap(new KeyValue<>("projectId", projectId)));

//保存新答案

insertList(questionAnswerList);

 

 

现在:

//删除旧答案

if (questionAnswerMapper.queryCount(Util.getSimpleMap(new KeyValue<>("projectId", projectId))) > 0) {//确保记录存在再删除,不然可能发生死锁

    deleteBy(Util.getSimpleMap(new KeyValue<>("projectId", projectId)));

}

//保存新答案

insertList(questionAnswerList);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值