springboot手动控制mysql事务

2022-11-10 21:55:14 浏览数 (1)

导入依赖导入依赖

代码语言: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 注解

0 人点赞