当前位置: 首页 > 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.dtcms.com/a/273401.html

相关文章:

  • 开发需要写单元测试吗?
  • 关键字前跟空格或首字母, 关键字后跟空格或标点符号; 标点符号后面不是必须跟空格;
  • 无监督光流,unflow, uflow,upflow
  • imx6ull-裸机学习实验14(下)——驱动DDR3和测试
  • 数组和指针回顾,练习与解析
  • OSCP官方靶场-Solstice WP
  • 【第二节】ubuntu server配置静态IP
  • (思维)洛谷 P3081 USACO13MAR Hill Walk 题解
  • 网络安全基础概念以及虚拟环境的搭建
  • alpinelinux的网络配置
  • ZW3D 二次开发-创建六面体方框
  • 力扣面试150题--全排列
  • AOSP自启动拦截框架Intent Firewall
  • 反向传播notes
  • 敏捷测试中的质量闸门如何设置?
  • 位运算算法题
  • 第七讲:C++中的string类
  • 深度学习参数初始化方法详解及代码实现
  • 深度学习×第7卷:参数初始化与网络搭建——她第一次挑好初始的重量
  • ZW3D 二次开发-创建椭球体
  • 灰度发布策略制定方案时可以参考的几个维度
  • 递推+高精度加法 P1255 数楼梯
  • apt -y参数的含义
  • 计算机视觉 之 数字图像处理基础(一)
  • Kubernetes 1.23.6 kube-scheduler 默认打分和排序机制详解
  • 多商户商城系统源码选型指南:开源 vs 定制,哪种更适合?
  • 救回多年未用kubeadm搭建的kubernetes集群
  • 5. isaac sim4.2 教程-Core API-操作机械臂
  • 用黑盒测试与白盒测试,读懂专利审查的 “双重关卡”​​
  • K8S的CNI之calico插件升级至3.30.2