乐观锁+synchronized

业务场景:

同一个活动,已报名人数不能大于报名人数,每一次报名,已报名人数+1,直至已报名人数等于大于报名人数。

由于存在多个用户在同一个活动的并发情况,采用@version乐观锁来防止已报名人数信息错乱,但在并发的情况下,乐观锁只能保证数据不错乱,并不能保证业务的正常进行,因为用户已经支付活动费用成功,不能因为乐观锁计算已报名人数失败而告知用户支付失败,这个时候需要解决并发情况。

原代码:

  TahActivityEntity activityEntity = tahActivityService.selectById(activityId);
  if(activityEntity.getActivityPeople()>=activityEntity.getTotalPeople()){
        throw new RRException(StatusCodeEnum.ERROR_EXISACTIVITYMAN_ERROR);
  }else {
       int act= activityEntity.getActivityPeople();
       activityEntity.setActivityPeople(act+1);
       tahActivityService.updateById(activityEntity);
       }


修改后的:

synchronized (activityId.toString().intern()) {
	TahActivityEntity activityEntity = tahActivityService.selectById(activityId);
	if (activityEntity.getActivityPeople() >= activityEntity.getTotalPeople()) {
		throw new RRException(StatusCodeEnum.ERROR_EXISACTIVITYMAN_ERROR);
	} else {
		int act = activityEntity.getActivityPeople();
		activityEntity.setActivityPeople(act + 1);
		int version = activityEntity.getVersion();
		activityEntity.setVersion(version + 1);

		boolean tryadd = tahActivityService.update(activityEntity, new EntityWrapper<TahActivityEntity>().eq("version", version).eq("activity_id", activityEntity.getActivityId()));
		if (!tryadd) throw new RRException("预约活动失败,请重试!");
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值