一次线上Mysql Deadlock

后台日志报错如下

### SQL: UPDATE t_shop_mp_liveroom     SET liveStatus = ? , coverImg = ?,shareImg = ?     where shopId =? and appId = ? and roomId =?
### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction] with root cause
com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

定位报错java代码

 while (true){
 		/*
 		 省略部分代码
 		 */     
       jsonObjects.stream().parallel().map(jsonObject -> {
               MpLiveRoom mpLiveRoom = getMpLiveRoom(jsonObject);
               mpLiveRoom.setAppId(appId);
               mpLiveRoom.setShopId(shopId);
               return mpLiveRoom;
           }).forEach( liveRoom -> {
               insertOrUpdate(liveRoom);
           });
        }

经过网上查阅 然后分析是应该为行级锁导致的
我们的xml是这样的

  <update id="updateLiveStatus" parameterType="com.leyingkeji.shop.entity.mp.MpLiveRoom">
    UPDATE t_shop_mp_liveroom
    SET liveStatus = #{liveStatus} , coverImg = #{coverImg,jdbcType=VARCHAR},shareImg = #{shareImg,jdbcType=VARCHAR}
    where shopId =#{shopId} and appId = #{appId} and roomId =#{roomId}
  </update>

数据库的索引如下:

  KEY `sa_id` (`shopId`,`appId`) USING BTREE,
  KEY `roomId` (`roomId`) USING BTREE,

问题的缘由也是犹豫这个索引的创建 由于第一个索引的存在 mysql在更新的时候会锁定 所有 shopId appId 相同的列 然后另外的并发操作进来的时候 也会试图锁定这些表

解决的办法就是 创建一个 shopId appId roomId的三个联合索引 让mysql的更新的时候只会锁定其中的一行数据! 这样就不会发生冲突!

  KEY `uniId` (`shopId`,`appId`,`roomId`)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Flink与MySQL之间发生死锁的情况可能是由于频繁写入某个表或资源导致的。这种情况下,当多个并发任务尝试同时获取锁时,可能会发生死锁。死锁是指两个或多个任务无法继续执行,因为它们互相等待对方释放资源。 一种解决此类死锁问题的方法是重新启动TaskManager。虽然可以通过编写定时任务来定期重启TaskManager,但这种方式可能不够优雅和高效。 另外,为了避免死锁的发生,可以考虑以下几个方案: 1. 增加数据库连接池的大小:通过增加连接池的大小,可以提高并发写入数据库的能力,从而减少死锁的概率。 2. 减少并发写入频率:如果可能的话,可以尝试降低并发写入数据库的频率,以减少死锁的可能性。 3. 使用事务和锁机制:可以使用事务和锁机制来确保写入数据库的原子性和一致性。通过合理使用事务和锁,可以减少死锁的风险。 总之,flink与mysql之间出现死锁的情况可能是由于频繁写入某个表或资源导致的,并且可以通过增加连接池大小、减少并发写入频率和使用事务和锁机制来减少死锁的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Flink结果集写Mysql的异常分析](https://blog.csdn.net/weixin_34101914/article/details/113300002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [flink mysql断开连接 使用druid 重写 flink-connector-jdbc_2.11-1.14.3.jar](https://blog.csdn.net/jy00885876/article/details/127226644)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值