资源锁住 其他人进不去 乐观锁 明显
秒杀100件 其中: 库存数量>= 抢到的数量
并发强卷 很多人并发强卷
强到的数量>=库存数量 (超卖现象) [乐观锁应用 (性能影响不大)]
则判断条件里面 性能高 安全系数低
添加版本字段 问题一 : 超发(总体)优惠卷:
// 3.校验库存:已发行数量[IssueNum] >= 库存总量[totalNum],则抛出异常:BadRequestException("优惠券库存不足") if (coupon.getIssueNum()>=coupon.getTotalNum()){ throw new BadRequestException("优惠券库存不足"); }
更新数据库里面的结果数据: 多线程并发操作 :发一个 +1 而where 则可以控制发放数量
int result = couponMapper.updateByCounpyId(coupon.getId());
if (result == 0) {
throw new BizIllegalException("领卷失败!");
}
@Update("update coupon set issue_num = issue_num + 1 WHERE id = #{couponId} and issue_num+1<=total_num")
一个一个执行: 悲观锁 效率低
问题二: 个人超领: 锁 : 尽量精确
/*锁 1.要放到事务外面 方法的调用加锁 因为事务有限制 2.可以好多人进来 锁定的是同一个人的同时间方法 不是所有人*/
//127 字符串.intern 变作常量池 synchronized 锁
动态代理 aop 容器管理的才可以进行事务 操作 但是脱离的话一定不能进行事务方法调用
问题3:方法内部调用事务失效问题 获取代理对象
this 是
代理对象是 所以要调用方法的时候 应该获取代理对象:
@EnableAspectJAutoProxy(exposeProxy = true)启动类: 接口暴露
// aopcontext 是代理接口 然后处理的是usercouponservice 强转 IUserCouponService userCouponService = (IUserCouponService) AopContext.currentProxy(); userCouponService.CheckAndCreateUserCopons(coupon,userId,null);
集群:问题4: 服务集群部署下jdk锁失效的问题
三个服务器 三个锁边做一把锁 超领
redisson redis setnx mylock 111 (设置一个key myload 如果不存在则 value设置成功) 增加互斥性: