ActivitiOptimisticLockingException:was updated by another transaction concurrently

场景:

本地接口测试正常,线上环境说调用接口一直报ActivitiOptimisticLockingException:was updated by another transaction concurrently

描述:

需求很简单就是同时更新两个表中的一个字段。

act_biz_suspension ,act_hi_biz_suspension 中通过id去更新suspendType字段,两个表中id是一样的

@Override
public Void execute(CommandContext commandContext) {
    if(businessSuspension == null) {
        throw new ActivitiIllegalArgumentException("businessSuspension is null");
    }
   // 更新act_biz_suspendsion
    commandContext.getBusinessSuspensionEntityManager().updateBusinessSuspension(businessSuspension);

    //同时更新act_hi_biz_suspendsion历史表 2016-01-06
    HistoricBusinessSuspensionEntity historicBusinessSuspensionEntity =
            new HistoricBusinessSuspensionEntity((BusinessSuspensionEntity)businessSuspension);

    commandContext.getHistoricBusinessSuspensionEntityManager().updateHistoricBusinessSuspension(historicBusinessSuspensionEntity);
    return null;
}

分析:

报错翻译就是乐观锁异常,被另一个事务同时更新

 原因:

前端传的id在act_biz_suspension表中是不存在的,然而在act_hi_biz_suspension是存在的,这样在更新第一张表的时候就会报错回滚,然而我本地测试的时候是按照两个表同时有数据测试的因此没啥问题,忽视了一个表中存在数据一个表中不存在数据的情况。

这是因为在 MySQL 中,乐观锁的实现是通过版本号(我们数据库是有版本号的)或时间戳等机制来实现的,如果一个表的更新操作失败了,另一个表的版本号或时间戳就会不匹配,导致另一个表的更新操作也失败。

结论:

1.因此在使用 MySQL 数据库时,在一个事务中同时更新两个表时,需要确保两个表的更新操作都能成功。如果其中一个表的更新操作失败了,整个事务就会回滚,包括另一个表的更新操作也会回滚,并且会抛出乐观锁异常。

2.本质上还是我的代码写的有问题,在同时更新多个表时,没有对入参数进行校验

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值