当前位置: 首页 > news >正文

天机学堂day10作业,完善兑换优惠券功能

UserCouponServiceImpl

 /*** 兑换码兑换优惠券* @param code*/@Transactional@Overridepublic void exchangeCoupon(String code) {//1、校验code是否为空if (StringUtils.isBlank(code)) {throw new BadRequestException("非法参数!");}//2、解析兑换码,得到自增idlong serialNum = CodeUtil.parseCode(code); //获取自增id//3、判断兑换码是否已兑换,采用redis的bitMap命令  setbit key offset value=1  如果方法返回true,则说明该兑换码已兑换boolean result = exchangeCodeService.updateExchangeCodeMark(serialNum, true);if (result) {//说明兑换码已经被兑换throw new BizIllegalException("该兑换码已被兑换!");}try {//4、判断兑换码是否存在,根据自增id 查询兑换码信息ExchangeCode exchangeCode = exchangeCodeService.getById(serialNum);if (exchangeCode == null) {throw new BizIllegalException("该兑换码不存在!");}//5、判断是否过期if (LocalDateTime.now().isAfter(exchangeCode.getExpiredTime())) {throw new BizIllegalException("该兑换码已过期!");}//校验并生成用户券Long userId = UserContext.getUser();//查询优惠券信息Coupon coupon = couponMapper.selectById(exchangeCode.getExchangeTargetId());if (coupon == null) {throw new BizIllegalException("该优惠券不存在!");}//6、判断是否超出限领的数量//7、优惠券已发放数量+1//8、生成用户券//9、更新兑换码的状态synchronized (userId.toString().intern()) {//从AOP上下文中,获取当前类代理对象IUserCouponService userCouponServiceProxy = (IUserCouponService) AopContext.currentProxy();//checkAndCreateUserCoupon(userId, coupon, serialNum);//这种写法是调用原对象的方法userCouponServiceProxy.checkAndCreateUserCoupon(userId, coupon, serialNum); //这种写法是调用代理对象方法,方法是有事务处理的}} catch (Exception e) {//10、将兑换码的状态重置exchangeCodeService.updateExchangeCodeMark(serialNum, false);throw e;}}

只需要在调用checkAndCreateUserCoupon时加上悲观锁处理方式,以及处理事务失效即可,更改代码如下:

synchronized (userId.toString().intern()) {
//从AOP上下文中,获取当前类代理对象
IUserCouponService userCouponServiceProxy = (IUserCouponService) AopContext.currentProxy();
//checkAndCreateUserCoupon(userId, coupon, serialNum);//这种写法是调用原对象的方法
userCouponServiceProxy.checkAndCreateUserCoupon(userId, coupon, serialNum); //这种写法是调用代理对象方法,方法是有事务处理的
}

http://www.xdnf.cn/news/131617.html

相关文章:

  • Python编程的真谛:超越语法,理解编程本质
  • version `GLIBCXX_3.4.32‘ not found 解决方法
  • Linux操作系统从入门到实战(三)Linux基础指令(上)
  • 基于风力推进器控制的小球实验装置设计与研究
  • 推荐一些实用的慢SQL优化方案
  • 2款常用文字提取软件
  • BGE-M3模型深度技术分析
  • Linux NIO 原理深度解析:从内核到应用的高性能 I/O 之道
  • 借助内核逻辑锁pagecache到内存
  • 协议CP锁死!EtherCAT×Modbus RTU网关让破烂王秒变赛博清洁工
  • maxscript根据音频创建动画表情
  • cdh平台管理与运维最佳实践
  • 【Linux网络编程】应用层协议HTTP(实现一个简单的http服务)
  • 如何理解计算机网卡完成数据传输的串并转换
  • linux离线部署open-metadata
  • PGSql查看表结构以及注释信息
  • system.img无法打包非PRODUCT_PACKAGES目标解析
  • BUUCTF-[GWCTF 2019]re3
  • DeepSeek/AI驱动的销售业绩倍增实战
  • RHCE 第三次作业 正向解析
  • # 构建词汇表:自然语言处理中的关键步骤
  • 浏览器f12可以搜索接口的入参 和返回内容
  • 【Langchain】RAG 优化:提高语义完整性、向量相关性、召回率--从字符分割到语义分块 (SemanticChunker)
  • netcore8.0项目部署到windows服务器中(或个人windows电脑),利用nginx反向代理
  • 【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)
  • Browser-use使用教程
  • 智慧联络中心SaaS平台Java项目面试实战
  • Linux:进程间通信---匿名管道
  • 数字域残留频偏的补偿原理
  • 【Linux网络】:套接字之UDP