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);
}

最新文章

  1. ajax的简单介绍
  2. C语言(1)
  3. Linux分区
  4. memcache 分布式,算法实现
  5. 【整理】c# 调用windows API(user32.dll)
  6. HeadFirst设计模式
  7. 第 16 章 观察者模式【Observer Pattern】
  8. B趣味求和
  9. sehll 小脚本的应用
  10. 我的第六个网页制作:table标签
  11. redis 突然大量逐出导致读写请求block
  12. window7下配置python2.7+tornado3.3开发环境
  13. 2018-2019 20165237网络对抗 Exp4 恶意代码分析
  14. mapreduce的cleanUp和setUp的特殊用法(TopN问题)和常规用法
  15. C#性能优化总结
  16. vue回到顶部组件
  17. IDEA报错:Error starting ApplicationContext. To display the auto-configuration report re-run your application with &#39;debug&#39; enabled. (&#39;crmWatcherService&#39;错误)
  18. JAXB--@XmlElementWrapper注解和泛型一起使用
  19. 【z】Storm - the world&#39;s best IDE framework for .NET
  20. Most efficient way to get the last element of a stream

热门文章

  1. (已转)C++知识图谱
  2. 终于定制出顺手的Obsidian斜杠命令
  3. 实践GoF的23种设计模式:命令模式
  4. docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES
  5. MVP、原型、概念验证,傻傻分不清楚?
  6. 从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」
  7. C组合方案
  8. 如何在 pyqt 中使用动画实现平滑滚动的 QScrollArea
  9. Codeforces Round #601 (Div. 2) A-E
  10. Blazor入门100天 : 身份验证和授权 (2) - 角色/组件/特性/过程逻辑