Spring 事务什么时候失效
Spring 事务什么时候失效
ps: 自然是他的正常流程跑不通的时候就失效了
说@Transaction注解修饰的方法必须是 public 的可以先冷静下,看看 org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource#computeTransactionAttribute
实现原理
基于切面编程在bean调用直接添加了事务拦截器,事务拦截器的具体实现
核心类
// 事务声明
org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource
org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor
org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor
// 切面事务支持
org.springframework.transaction.interceptor.TransactionAspectSupport
// 事务管理
org.springframework.transaction.support.AbstractPlatformTransactionManager
org.springframework.transaction.reactive.AbstractReactiveTransactionManager
失效场景
- 切面失效
例如调用方法生命为 final 方法,CGLib 动态代理无法代理该方法。
类内部方法内部调用,真要调用的话简易采用懒加载的方式再注入自己一次 - Spring 事务配置失效
这个就多了去了,@Transaction 注解里面能配置的属性都有影响。 - Isolution 隔离机制问题造成
- TransactionManager 事务管理器不同
- Propagation 事务传播机制设置错误
- rollback 和 noRollback 相关异常配置
附属补充
| Propogation | Description |
|---|---|
| REQUIRED | 默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 |
| SUPPORTS | 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 |
| MANDATORY | 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 |
| REQUIRES_NEW | 创建一个新的事务,如果当前存在事务,则把当前事务挂起。 |
| NOT_SUPPORTED | 以非事务方式运行,如果当前存在事务,则把当前事务挂起。 |
| NEVER | 以非事务方式运行,如果当前存在事务,则抛出异常。 |
| NESTED | 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。 |


浙公网安备 33010602011771号