首页 > 其他分享 >spring 事务不生效

spring 事务不生效

时间:2023-02-01 12:23:20浏览次数:42  
标签:事务 return voucherOrder seckillVoucher 生效 voucherId Result spring fail

1.方法自身(this)调用问题,导致事务失效

 

非事务方法seckillVoucher()中调用的自身类的事务方法createVoucherOrder()。

解决办法:

ps:要加aspj依赖,同时在Application中开启@EnableAspectJAutoProxy(exposeProxy = true)

@Override
public Result seckillVoucher(Long voucherId) {
    //1.判断优惠券ID是否存在
    SeckillVoucher seckillVoucher = iSeckillVoucherService.getById(voucherId);
    //2.不存在,返回异常
    if(seckillVoucher == null){
        return Result.fail("优惠券不存在");
    }
    //3.存在,判断秒杀是否开始
    if(seckillVoucher.getBeginTime().isAfter(LocalDateTime.now())){
        return Result.fail("秒杀未开始");
    }
    //4.存在,判断秒杀是否结束
    if(seckillVoucher.getEndTime().isBefore(LocalDateTime.now())){
        return Result.fail("秒杀已结束");
    }
    //5.库存为空,返回异常
    if(seckillVoucher.getStock() < 1){
        return Result.fail("库存不足");
    }
    Long userId = UserHolder.getUser().getId();
/*----------这里调用-------------*/ synchronized (userId.toString().intern()){ return createVoucherOrder(voucherId); }
/*----------用这种-------------*/ synchronized (userId.toString().intern()){ return ((IVoucherOrderService)AopContext.currentProxy()).createVouch } } @Transactional public Result createVoucherOrder(Long voucherId){ //判断用户是否已经有优惠券 QueryWrapper<VoucherOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id",UserHolder.getUser().getId()); queryWrapper.eq("voucher_id",voucherId); int record = this.count(); if(record > 0){ return Result.fail("this user have voucher"); } //6.库存不为空,新增数据,减库存 boolean success = iSeckillVoucherService.update() .setSql("stock = stock - 1") .eq("voucher_id", voucherId) .gt("stock",0) .update(); if(!success){ return Result.fail("库存不足"); } long orderId = redisWorker.nextId("order"); VoucherOrder voucherOrder = new VoucherOrder(); voucherOrder.setId(orderId); voucherOrder.setUserId(UserHolder.getUser().getId()); voucherOrder.setVoucherId(voucherId); save(voucherOrder); //返回订单ID return Result.ok(orderId); }

 

标签:事务,return,voucherOrder,seckillVoucher,生效,voucherId,Result,spring,fail
From: https://www.cnblogs.com/cciscc/p/17082136.html

相关文章

  • Spring Security、Oauth2与JWT
    SpringSecurity、Oauth2与JWT安全框架基础认证、会话与授权用户身份认证:用户身份认证即用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问。常见的......
  • Spring-Boot/Spring-Cloud继承问题
    继承使用dependencyManagement进行依赖管理,但是只有使用继承的时候,dependencyManagement中声明的依赖才可能被子pom.xml用到,如果我的项目本来就继承了一个父pom.xml,但是现......
  • SpringBoot 前端大文件上传
    ​ 最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的......
  • springboot Config类@Import导入Config类中bean覆盖方法
    spring-cloud-openfeign-core第三方包里面有FeignClientsConfiguration.class里面是包括了feign需要的bean,但里面已经定义了feignEncoder、feignDecoder,如果项目中想要定制......
  • SpringMVC前后端分离关键
    SpringMVC前后端分离关键前后端一般通过json数据的相互转换来实现分离一、JSONJSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广......
  • Spring-IOC/DI配置管理第三方bean
    Spring-IOC/DI配置管理第三方bean1,IOC/DI配置管理第三方bean1.1案例:数据源对象管理本次案例将使用咱们前面提到过的数据源Druid(德鲁伊)和C3P0来配置学习下。1.1.1......
  • 初次使用 WebSocket -springboot 集成
    参考自:SpringBoot集成websocket_清泉影月的博客-CSDN博客,WebSocket中利用service层交互数据库_戒烟的李白的博客-CSDN博客_websocketservice核心依赖<dependency>......
  • 分布式事务之Seata
    Seata使用​​​https://github.com/seata/seata-samples​​引入依赖:<!--Seata依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cl......
  • SpringBoot2.0版本与老版本区别
    SpringBoot2.0版本新特性 以Java8为基准SpringBoot2.0要求Java版本必须8以上,Java6和7不再支持。内嵌容器包结构调整为了支持reactive使用场景,内嵌的容器包结构......
  • Springcloud之Gateway入门
    API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信......