spring 事务不生效
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);
}
spring 事务不生效的更多相关文章
- Spring事务不生效问题
事务未生效可能造成严重的数据不一致性问题,因而保证事务生效至关重要.Spring事务是通过Spring aop实现的,所以不生效的本质问题是spring aop没生效,或者说没有代理成功,所以有必要了 ...
- Spring基础系列-Spring事务不生效的问题与循环依赖问题
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9476550.html 一.提出问题 不知道你是否遇到过这样的情况,在ssm框架中开发we ...
- mysql测试spring事务是否生效
同时对三张表进行插入操作,事务保证完整性.下面进行简单测试: 1. 锁定表 锁定用户表 LOCK TABLES user WRITE; 查看表是否锁定: show ; 显示被锁定的表. 2. 验证在同 ...
- [转]Spring事务嵌套引发的血案---Transaction rolled back because it has been marked as rollback-only
原文地址:https://blog.csdn.net/f641385712/article/details/80445912 1.概述 想必大家一想到事务,就想到ACID,或者也会想到CAP.但笔者今 ...
- spring中注解式事务不生效的问题
常用的解决方法可以百度,我针对我的问题描述一下 Mysql中InnoDB引擎才支持事务, MyISAM不支持事务. 当你尝试了各种方法解决spring中注解式事务不生效时, 一定要查看一下数据库中表的 ...
- 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...
- Spring中同一个service中方法相互调用事务不生效问题解决方案
问题描述: 我们在用Spring框架开发Web项目过程中,经常需要用同一个service中的一个方法调用另一个方法,如果此时调用方没有添加事务注解@Transactional,而在被调用方添加事务注解 ...
- 两个与spring事务相关的问题
有些spring相关的知识点之前一直没有仔细研究:比如spring的事务,并不是没有使用,也曾经简单的在某些需要事务处理的方法上通过增加事务注解来实现事务功能,仅仅是跟随使用(甚至并未测试过事务的正确 ...
- 【转】Spring事务管理
原文链接 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的.该接口包含与事务属性有关的方法.具体如清单 1 所示: 清单 1. TransactionDefi ...
- Spring事务讲解示例
Spring 事务Transaction1.事务的属性1.1 事务隔离IsolationLevel1.2 事务传播PropagationBehavior1.3 事务超时Timeout1.4 只读状态R ...
随机推荐
- STM32用寄存器实现电平翻转(一个按键控制LED灯的开关)
代码 GPIOx -> ODR ^= GPIO_Pin_x 如果加载了标准库的文件: GPIOx中的x可以为(A,B,C,D--) GPIO_Pin_x中的x可以为(1,2,3--) 如果没有加 ...
- day03-功能实现02
家居网购项目实现02 5.功能04-会员登录 5.1需求分析/图解 需求如图: 输入用户名.密码后提交 判断该用户是否存在 如果存在,显示登录成功页面 否则返回登录页面,要求重新登录 要求改进登录密码 ...
- 实时采集MySQL数据之轻量工具Maxwell实操
@ 目录 概述 定义 原理 Binlog说明 Maxwell和Canal的区别 部署 安装 MySQL准备 初始化Maxwell元数据库 Maxwell进程启动 命令行参数 配置文件 实时监控Mysq ...
- week_3
Andrew Ng机器学习笔记 Week_3 -- -Logistic Regression This week, we'll be covering logistic regression. Log ...
- vue实现移动端左右菜单双向联动效果
话不多说,上demo <template> <div id="app"> <header>左右列表双向联动</header> < ...
- 分享项目中在用的asp.net下载业务的服务端基类(支持客户端显示下载百分比进度,支持并发数控制,支持限速)
/// <summary> /// 功能简介:asp.net的下载业务的服务端基类(支持客户端显示下载百分比进度,支持并发数控制,支持限速) /// 创建时间:2015-11-20 /// ...
- 简单体验一个高性能,简单,轻量的ORM库- Dapper (无依赖其它库,非常方便高效)
步骤1)引入该ORM库. 使用Nuget搜索"Dapper"安装或者直接从github上下载源码 (https://github.com/StackExchange/Dapper ...
- Java面试的一些面试题
10<<2=? tip:10的二进制为1010,左移两位即:101000,换算为十进制为2的5次方加上2的三次方等于40 答:40 1.dr-xr-xr-r解释一下权限的含义 tip: ...
- 10分钟做好 Bootstrap Blazor 的表格组件导出 Excel/Word/Html/Pdf
上篇: Bootstrap Blazor 实战 通用导入导出服务(Table组件) 1.新建工程 新建工程b14table dotnet new blazorserver -o b14table 将项 ...
- [LeetCode]螺旋矩阵
题目 代码 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& ma ...