导入依赖导入依赖
代码语言: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 注解