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

失效场景

  1. 切面失效
    例如调用方法生命为 final 方法,CGLib 动态代理无法代理该方法。
    类内部方法内部调用,真要调用的话简易采用懒加载的方式再注入自己一次
  2. Spring 事务配置失效
    这个就多了去了,@Transaction 注解里面能配置的属性都有影响。
  3. Isolution 隔离机制问题造成
  4. TransactionManager 事务管理器不同
  5. Propagation 事务传播机制设置错误
  6. rollback 和 noRollback 相关异常配置

附属补充

Propogation Description
REQUIRED 默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。

image

参考地址:面试突击87:说一下 Spring 事务传播机制

posted @   临渊不羡渔  阅读(2)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示