前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot手动控制mysql事务

springboot手动控制mysql事务

作者头像
用户10125653
发布2022-11-10 21:55:14
2.1K0
发布2022-11-10 21:55:14
举报
文章被收录于专栏:change

导入依赖导入依赖

代码语言:javascript
复制
    @Resource
    private PlatformTransactionManager platformTransactionManager;

    @Resource
    private TransactionDefinition transactionDefinition;

开启事务/提交事务

代码语言:javascript
复制
      TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);
        try {
            this.saveBatch(comboParams);
            this.update(Wrappers.<ComboParam>lambdaUpdate().set(ComboParam::getResParamId,4).eq(ComboParam::getComboEntranceId,4));
            platformTransactionManager.commit(transaction);
        } catch (Exception e) {
            platformTransactionManager.rollback(transaction);
        }

应用场景

  • 当Transactional碰到锁
  • 先拿锁。
  • 查询库存。
  • 判断是否还有库存。
  • 有库存则执行减库存,创建订单的逻辑。
  • 没有库存则返回。
  • 释放锁。
  • 代码

完全符合我们之前的那份代码片段,有事务,也有锁

  • 触发了代码之后,库存为 0 了,没有问题。
  • 但是,订单居然有 20 笔!

我们的逻辑

代码运行的逻辑

  • 在上面的示例代码的情况下,事务的提交在方法运行结束之后。

你细品,这个描述是不是迷惑性就没有那么强了,甚至你还会恍然大悟:这不是常识吗?

注意

Transactional失效场景介绍失效场景介绍

  • 第一种 非public方法
  • 第二种 内部方法调用
  • 第三种 异常未抛出

结语

当然这里也有其他的解决方案,但是我推荐还是手动开启事务,手动提交事务, 再者就是重新创建一个类专门加锁,另一个类专门控制事务,就可以用Transactional 注解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入依赖导入依赖
  • 开启事务/提交事务
  • 应用场景
  • 注意
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档