当前位置: 首页 > 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.lryc.cn/news/584775.html

相关文章:

  • STM32-ADC
  • squash压缩合并
  • 计算机视觉速成 之 概述
  • 【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(2)
  • Linux:库的原理
  • (C++)任务管理系统(文件存储)(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • 【算法笔记 day three】滑动窗口(其他类型)
  • 使用球体模型模拟相机成像:地面与天空的可见性判断与纹理映射
  • STM32第十九天 ESP8266-01S和电脑实现串口通信(2)
  • Linux 日志分析核心命令速查表
  • UE5源码模块解析与架构学习
  • 【第二节】ubuntu server配置静态IP
  • 蜻蜓I即时通讯系统重构宣言:破茧重生的技术革命-长痛不如短痛卓伊凡|麻子|果果
  • 【HTTP服务端】Cookie?Session?Token?
  • Spring Boot项目中大文件上传的优化策略与实践
  • LVGL学习笔记-----进度条控件(lv_bar)
  • 攻防世界——web题catcat-new session值伪造
  • Linux驱动学习day21(GPIO子系统)
  • 查看uniapp 项目中没有用到依赖
  • 【IO复用】五种IO模型
  • 1. COLA-DDD的实战
  • 抽象类与接口:Java面向对象设计的两大支柱
  • 中文分词:分词工具及使用实践总结
  • 26-计组-外存
  • Docker-构建镜像并实现LNMP架构
  • 差分和前缀和
  • day01 - 数组part01
  • 如何安装python以及jupyter notebook
  • 黄瓜苦多于意外,苦瓜苦来自本源——“瓜苦”探源
  • BERT模型基本原理及实现示例