Spring事务监听管理器TransactionSynchronizationManager的使用

本文介绍了如何使用Spring的TransactionSynchronizationManager来监听和管理事务。通过TransactionSynchronizationManager.isSynchronizationActive()检查当前事务状态,并注册TransactionSynchronization监听器,实现事务提交后的回调操作。示例中展示了如何在事务提交后执行异步任务,确保任务在事务完成后才运行。

1. Spring 提供了事务同步管理器让我们能监听Spring的事务操作,这个可以获取到当前是否存在事务。

TransactionSynchronizationManager.isSynchronizationActive()

2. 这是注册一个监听器,需要传入一个对象TransactionSynchronization

TransactionSynchronizationManager.registerSynchronization()

他有两个方法,一个是事务提交后执行,一个是事务完成后执行(不会区分他是提交还是回滚操作)

@Override
  public void afterCommit() {
      // 事务后提交
 }
 public void afterCompletion(int status) {
     // 事务完成后执行(不会区分他是提交还是回滚操作)
 }

 3. 举个例子如下:

 //当前事务提交后方可进行异步任务,防止异步任务先于未提交的事务执行
    private void callBack(Invoice invoice){
        boolean synchronizationActive = TransactionSynchronizationManager.isSynchronizationActive();
        if (synchronizationActive) { // 当前存在事务,在事务提交后执行
            TransactionSynchronizationManager.registerSynchronization(
                    new TransactionSynchronizationAdapter() {
                        @Override
                        public void afterCommit() { // 监听事务提交完成
                            doCall(invoice);
                        }
                    }
            );
        } else {
             // 当前不存在事务,直接执行
            doCall(invoice);
        }
    }

<think>我们被要求介绍Spring事务管理,包括其工作原理、常用注解和配置方式。根据引用内容,我们可以整合以下信息: 1. 引用[1]介绍了Spring事务管理的基本概念:确保数据一致性和完整性,支持声明式(@Transactional)和编程式事务管理,遵循ACID特性。 2. 引用[2]和[5]提到了注解(如@Autowired)的工作原理,通过反射机制实现。类似地,@Transactional注解也是基于类似机制工作。 3. 引用[3]展示了Spring AOP的配置示例,因为Spring事务管理底层依赖于AOP。 4. 引用[4]给出了配置事务管理所需的依赖和配置数据源、事务管理器的示例。 因此,我们将从以下几个方面组织回答: 1. Spring事务管理概述(定义、目的、ACID特性) 2. 工作原理(基于AOP和代理机制) 3. 常用注解(重点@Transactional,以及相关属性) 4. 配置方式(XML配置和基于Java的配置) 5. 示例代码 同时,我们将生成相关问题。</think>### Spring事务管理详解:工作原理、常用注解与配置方式 Spring事务管理是确保数据库操作**原子性、一致性、隔离性和持久性(ACID)**的核心机制[^1]。其核心思想是通过**代理模式**和**AOP(面向切面编程)**将事务逻辑与业务代码解耦,实现声明式事务管理。下面从工作原理、常用注解和配置方式三方面展开说明。 --- #### 一、工作原理:基于AOP的动态代理 Spring事务管理通过动态代理在运行时增强目标方法,实现事务控制流程: 1. **代理创建**: 当容器初始化Bean时,若检测到`@Transactional`注解,会通过`BeanPostProcessor`创建代理对象(JDK动态代理或CGLIB代理)[^5]。 ```java // 示例:代理对象伪代码 public class TransactionProxy extends TargetBean { public void businessMethod() { try { beginTransaction(); // 开启事务 super.businessMethod(); // 执行业务方法 commitTransaction(); // 提交事务 } catch (Exception e) { rollbackTransaction(); // 回滚事务 } } } ``` 2. **事务拦截器链**: 通过`TransactionInterceptor`拦截目标方法,调用`PlatformTransactionManager`(如`DataSourceTransactionManager`)管理事务生命周期[^1]。 - **关键步骤**: - 获取事务定义(传播行为、隔离级别等) - 开启事务连接(绑定到当前线程`ThreadLocal`) - 执行业务逻辑 - 根据异常类型决定提交或回滚 3. **事务同步机制**: 使用`TransactionSynchronizationManager`确保同一线程内多个DAO操作共享同一个数据库连接[^4]。 --- #### 二、常用注解与属性详解 ##### 1. 核心注解 `@Transactional` 控制事务行为,可作用于类或方法: ```java @Transactional( propagation = Propagation.REQUIRED, // 事务传播行为(默认:当前有事务则加入,无则新建) isolation = Isolation.DEFAULT, // 隔离级别(默认:使用数据库默认级别) timeout = 30, // 超时时间(秒) rollbackFor = {SQLException.class}, // 触发回滚的异常类型 noRollbackFor = NullPointerException.class // 不触发回滚的异常 ) public void transferMoney(Account from, Account to, double amount) { // 转账业务逻辑 } ``` ##### 2. 辅助注解 - **`@EnableTransactionManagement`** 在配置类上启用事务管理(Spring Boot中自动配置)。 - **`@TransactionalEventListener`** 监听事务事件(如事务提交后发送消息)[^5]。 --- #### 三、配置方式详解 ##### 方式1:XML配置(传统方式) ```xml <!-- 引用[3]的配置扩展 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启注解驱动事务 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 配置事务通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="transfer*" propagation="REQUIRED" timeout="30"/> <tx:method name="get*" read-only="true"/> <!-- 只读事务优化性能 --> </tx:attributes> </tx:advice> <!-- AOP切面绑定 --> <aop:config> <aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/> </aop:config> ``` ##### 方式2:Java Config(推荐) ```java @Configuration @EnableTransactionManagement // 启用事务注解 public class AppConfig { @Bean public DataSource dataSource() { // 配置数据源(如HikariCP) return new HikariDataSource(...); } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); // 引用[4] } } ``` ##### 方式3:Spring Boot自动配置 Spring Boot自动配置`DataSourceTransactionManager`,只需添加依赖: ```xml <!-- 引用[4]的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <!-- 示例数据库 --> </dependency> ``` --- #### 四、核心机制对比 | **特性** | **声明式事务** (`@Transactional`) | **编程式事务** (`TransactionTemplate`) | |------------------|----------------------------------------|--------------------------------------| | **实现方式** | AOP动态代理 | 手动编写事务代码 | | **代码侵入性** | 低(注解驱动) | 高(需显式调用API) | | **灵活性** | 中等(通过属性配置) | 高(可精细控制事务边界) | | **适用场景** | 大多数业务方法 | 复杂事务逻辑(如条件回滚) | > **编程式事务示例**: > ```java > @Autowired > private TransactionTemplate transactionTemplate; > > public void complexOperation() { > transactionTemplate.execute(status -> { > try { > // 业务逻辑 > return result; > } catch (Exception e) { > status.setRollbackOnly(); // 手动回滚 > throw e; > } > }); > } > ``` --- #### 五、常见问题解决方案 1. **事务不生效**: - 确保注解方法为`public`(代理限制) - 避免自调用(`this.method()`绕过代理) - 检查异常类型是否匹配`rollbackFor` 2. **性能优化**: - 只读查询使用`@Transactional(readOnly=true)` - 设置合理的事务超时时间 3. **分布式事务**: 结合Seata或Spring Cloud Alibaba实现跨服务事务[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值