springboot手动控制mysql事务

导入依赖导入依赖

    @Resource
    private PlatformTransactionManager platformTransactionManager;

    @Resource
    private TransactionDefinition transactionDefinition;

开启事务/提交事务

      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 注解

end

评论