当前位置: 首页 > news >正文

Spring事务管理深度解析:原理、实践与陷阱

Spring事务管理深度解析:原理、实践与陷阱

一、事务基础概念

ACID原则

  • 原子性(Atomicity):事务内的操作要么全部成功,要么全部回滚
  • 一致性(Consistency):事务前后数据库状态保持一致
  • 隔离性(Isolation):并发事务间相互隔离
  • 持久性(Durability):事务提交后数据永久存储

二、Spring事务核心接口

public interface PlatformTransactionManager {TransactionStatus getTransaction(TransactionDefinition definition);void commit(TransactionStatus status);void rollback(TransactionStatus status);
}public interface TransactionDefinition {int getIsolationLevel();int getPropagationBehavior();int getTimeout();boolean isReadOnly();
}

三、事务配置方式

1. 声明式事务(推荐)

<!-- XML配置 -->
<tx:annotation-driven transaction-manager="txManager"/><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
// 注解驱动
@Configuration
@EnableTransactionManagement
public class AppConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource ds) {return new DataSourceTransactionManager(ds);}
}

2. 编程式事务

transactionTemplate.execute(status -> {try {userDao.update(user1);logDao.insert(log);return true;} catch (Exception e) {status.setRollbackOnly();return false;}
});

四、@Transactional详解

属性配置

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,timeout = 30,readOnly = false,rollbackFor = {BusinessException.class},noRollbackFor = {SystemException.class}
)
public void businessMethod() { ... }

传播行为(Propagation)

行为类型说明
REQUIRED(默认)存在事务则加入,没有则新建
REQUIRES_NEW总是新建事务,挂起当前事务
NESTED嵌套事务,使用保存点实现部分回滚
SUPPORTS存在事务则加入,没有则以非事务运行
NOT_SUPPORTED非事务执行,挂起当前事务
MANDATORY必须存在事务,否则抛异常
NEVER必须非事务执行,否则抛异常

隔离级别(Isolation)

级别脏读不可重复读幻读说明
READ_UNCOMMITTED最低隔离级别
READ_COMMITTED(默认)×避免脏读
REPEATABLE_READ××MySQL默认级别
SERIALIZABLE×××最高隔离级别

五、事务失效场景

  1. 非public方法:基于代理的AOP无法拦截private方法
  2. 自调用问题:类内部方法调用不会经过代理对象
    解决方案
    @Autowired
    private ApplicationContext context;public void methodA() {context.getBean(ThisClass.class).methodB();
    }
    
  3. 异常类型不匹配:默认只回滚RuntimeException和Error
  4. 多线程调用:不同线程属于不同事务上下文
  5. 错误捕获异常:catch后未重新抛出
    try { ... } 
    catch (Exception e) {// 需添加:throw new RuntimeException(e);
    }
    

六、高级特性

1. 事务同步

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {// 事务提交后操作}});

2. 多数据源事务

@Bean
@Primary
public PlatformTransactionManager primaryTM(DataSource ds1) {return new DataSourceTransactionManager(ds1);
}@Bean
public PlatformTransactionManager secondaryTM(DataSource ds2) {return new DataSourceTransactionManager(ds2);
}// 使用指定事务管理器
@Transactional(transactionManager = "secondaryTM")
public void crossDatabaseOp() {...}

七、最佳实践

  1. 事务方法保持简短,避免远程调用
  2. 明确指定rollbackFor属性
  3. 只读查询添加@Transactional(readOnly=true)
  4. 嵌套事务使用PROPAGATION_NESTED
  5. 监控事务执行时间(超过3秒需优化)
http://www.xdnf.cn/news/1097461.html

相关文章:

  • Web前端:table标签的用法与属性
  • CMake指令:add_custom_command和add_custom_target详解
  • RLHF(人类反馈的强化学习)
  • SD NAND闪存技术全面解析
  • Linux 文件 IO 详解:从系统调用到实际操作
  • BatchNorm解决梯度消失/爆炸
  • 三维旋转沿轴分解
  • MySQL断开连接后无法正常启动解决记录
  • (鱼书)深度学习入门2:手搓感知机
  • 华锐云空间展销编辑器:开启数字化展示新时代​
  • MBSE工具+架构建模:从效率提升到质量赋能
  • C++中的左值、右值与std::move()
  • 什么是Apache Ignite的affinity(亲和性)
  • 【科研绘图系列】R语言绘制相关系数图
  • Qt cannot find C:\WINDOWS\TEMP\cctVBBgu: Invalid argument
  • 【WEB】Polar靶场 Day8 详细笔记
  • 目标检测流程图绘制
  • Java多线程:核心技术与实战指南
  • CPT203-Software Engineering: Software Testing软件测试
  • centos7 安装jenkins
  • 【Python】基于Python提取图片验证码
  • Linux面试问题-软件测试
  • Uniapp中的uni.scss
  • JavaScript
  • 2025.07.09华为机考真题解析-第一题100分
  • 快速合并多个CAD图形为单一PDF文档的方法
  • MinerU将PDF转成md文件,并分拣图片
  • UEditor 对接 秀米 手机编辑器流程与问题
  • LVGL学习笔记-----进度条控件(lv_bar)
  • [特殊字符] LLM(大型语言模型):智能时代的语言引擎与通用推理基座