【Database】Mysql更新数据库操作时产生的死锁问题(Deadlock found...)

Mysql更新数据库操作时产生的死锁问题(Deadlock found…)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to…

产生问题代码

MybatisPlus的写法,.eq类似于Where后的语句。


    @Override
    public void updateProgrammeUser(Long userId, String externalNameKey, Long programmeId,
                                    String externalProgrammeKey, String externalKey, String status) {

        UpdateWrapper<ExternalProgrammeUserModel> updateWrapper = new UpdateWrapper<>();
        updateWrapper.lambda()
                    .set(ExternalProgrammeUserModel::getStatus, Constant.External.SUCCESS)
                    .set(ExternalProgrammeUserModel::getExternalProgrammePrimaryKey, externalProgrammeKey)
                    .set(ExternalProgrammeUserModel::getExternalUserPrimaryKey, externalNameKey)
                    .eq(ExternalProgrammeUserModel::getExternalKey, externalKey)
                    .eq(ExternalProgrammeUserModel::getInternalUserId, userId)
                    .eq(ExternalProgrammeUserModel::getInternalProg
        baseMapper.update(null, updateWrapper);
    }

场景描述:

5个类以异步的方式调用此方法,更新同一张表。

可能产生的原因

  1. where后面的字段没有加索引
  2. (以上面代码举例)想当然的为where后的每一个字段加上索引,此时认为后面三个字段可以确定同一行,认为只锁住了一行。

其实行锁是对索引加锁,那么当where语句中包含多个条件时候,mysql在执行时也只用到了区分度最大的字段,所以实际上只使用了一个字段的索引,那么根据这个字段进行过滤出来的记录数可能就不止一条,也就是锁住了本不该锁住的行。

解决方案

使用联合索引(以上面代码举例),在数据库添加external_key,internal_user_id,internal_programme_id三个字段的联合索引。

alter table muses_external_programme_user add index update_test_index(external_key,internal_user_id,internal_programme_id);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值