Mysql因为索引造成死锁DEADLOCK

生产环境中出现死锁问题,分析指出是由于索引(INX_ACCOUNT_ID)导致的行级锁冲突。由于更新操作中查询结果集过于广泛,多个线程间的资源竞争引发了死锁。解决方案是降低查询结果集的颗粒度,减少更新时的锁冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日生产发生死锁,日志和表索引如下。

分析是

因为索引的原因,在循环对数据进行Update的时候,因为查询的结果集颗粒度很大,造成多个线程因为索引INX_ACCOUNT_ID产生了行级锁。

解决办法是,缩小查询结果集的颗粒度,就是缩小查询的结果范围,在循环Update的时候不会造成资源竞争。

循环如下

//新的循环
List<Map<String,Object>> accountMap=jsperManagerService.selectJsperDataUnProcessMoreKey();
		logger.info("STORM SPOUT UNACCOUNTID LIST SIZE IS " + accountMap.size());
		// TODO 这里Spout业务
		if(CollectionUtils.isNotEmpty(accountMap)){
			logger.info("STORM SPOUT BIGLOOP START " + System.currentTimeMillis());
			for(Map<String,Object> mapAccountId:accountMap){
				if(mapAccountId.get("ACCOUNT_ID")!=null){
					String accountId = "";
					String number = "";
					accountId = String.valueOf(mapAccountId.get("ACCOUNT_ID"));
					number = String.valueOf(mapAccountId.get("NUMBER"));
					List<Map<String,Object>> list = jsperManagerService.selectJsperInterDataMoreKey(accountId,number);//获取接口信息
					logger.info("STORM SPOUT LITTLELOOP START " + System.currentTimeMillis());
					for(Map<String,Object> map:list){
						if(map != null){
							if(updateJsperStatus(map,true)){
								outputCollector.emit(new Values(map));
							}
						}
					}
					logger.info("STORM SPOUT LITTLELOOP END " + System.currentTimeMillis());
				}
			}
			logger.info("STORM SPOUT BIGLOOP END " + System.currentTimeMillis());
		}

//原有循环
//List<Map<String,Object>> unaccountId=jsperManagerService.selectJsperDataUnProcess();
//		logger.info("STORM SPOUT UNACCOUNTID LIST SIZE IS " + unaccountId.size());
//		// TODO 这里Spout业务
//		if(CollectionUtils.isNotEmpty(unaccountId)){
//			logger.info("STORM SPOUT BIGLOOP START " + System.currentTimeMillis());
//			for(Map<String,Object> mapAccountId:unaccountId){
//				if(mapAccountId.get("ACCOUNT_ID")!=null){
//					List<Map<String,Object>> list = jsperManagerService.selectJsperInterData(mapAccountId.get("ACCOUNT_ID").toString());//获取接口信息
//					logger.info("STORM SPOUT LITTLELOOP START " + System.currentTimeMillis());
//					for(Map<String,Object> map:list){
//						if(map != null){
//							//JpInterCallerDto dto = (JpInterCallerDto) ConversionUtil.map2po(map, JpInterCallerDto.class);
//							if(updateJsperStatus(map,true)){
//								outputCollector.emit(new Values(map));
//							}
//						}
//					}
//					logger.info("STORM SPOUT LITTLELOOP END " + System.currentTimeMillis());
//				}
//			}
//			logger.info("STORM SPOUT BIGLOOP END " + System.currentTimeMillis());
//		}

 

索引

MariaDB [jliot]> show index in JP_INTER_CALLER;
+-----------------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------                                         -+---------+---------------+
| Table           | Non_unique | Key_name             | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type                                          | Comment | Index_comment |
+-----------------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------                                         -+---------+---------------+
| jp_inter_caller |          1 | JP_CALLER_INX        |            1 | CREATE_TIME | A         |      234671 |     NULL | NULL   |      | BTREE                                               |         |               |
| jp_inter_caller |          1 | JP_CALLER_CUSTID_INX |            1 | CUST_NUMBER | A         |     1173359 |     NULL | NULL   | YES  | BTREE                                               |         |               |
| jp_inter_caller |          1 | INX_ACCOUNT_ID       |            1 | USE_TAG     | A         |          14 |     NULL | NULL   | YES  | BTREE                                               |         |               |
| jp_inter_caller |          1 | INX_ACCOUNT_ID       |            2 | ACCOUNT_ID  | A         |          96 |     NULL | NULL   | YES  | BTREE                                               |         |               |
| jp_inter_caller |          1 | JP_CALLER_PARAM3_INX |            1 | PARAM3      | A         |          28 |     NULL | NULL   | YES  | BTREE                                               |         |               |
+-----------------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+-----------                                         -+---------+---------------+
5 rows in se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值