Spring声明式事务@Transactional失效场景及解决方案
- 失效场景:
1.1
- @Transactional 应用在非 public 修饰的方法上
- @Transactional 注解属性 propagation设置错误
- @Transactional 注解属性 rollbackFor 设置错误
- 同一个类中方法调用,导致@Transactional失效
- 异常被catch捕获导致@Transactional失效
- 长事务问题
本篇主要介绍长事务问题
长事务定义:
运行时间比较长,长时间未提交的事务,也可以称之为大事务
长事务危害:
- 数据库连接池被占满,应用无法获取连接资源;
- 容易引发数据库死锁;
- 数据库回滚时间长;
- 在主从架构中会导致主从延时变大
长事务造成事务失败示例:
/**
- 创建OA流程并保存业务表
**/
@Transactional(rollbackFor = Exception.class)
public void save(RequestBillDTO requestBillDTO){
//调用流程HTTP接口创建工作流