我司线上并发bug

51 阅读1分钟
  1. 背景:

中国移动签到有你活动,每日可签到最多一次

  1. 问题:

因枷锁服务引起的问题

image.png 当两个线程都解锁失败后,事务并没有回滚,因此数据库出现两条签到记录,数据出现了不一致性 3. 解决:

在finally代码块中判断解锁失败后,加入手动回滚事务的代码块

            boolean unLockFlag = this.iLockService.unLock(cdsContext, cdsContext.getActCode(), mobile);
            logger.info("==============================>>>flip解锁:" + unLockFlag);
            if (!unLockFlag) {
                //手动事务回滚
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                //解锁失败
                this.errorInfo(cdsResult, resultMap, ERROR_UNLOCK_FAIL_CODE, ERROR_UNLOCK_FAIL_MSG, IResultCode.CDS_HANDLE_FAILED);
            }