Spring中的事务管理器:
在Spring中,事务管理器是一个实现了PlatformTransactionManager
接口的对象,用于统一管理和控制应用程序中的事务。事务管理器的作用是在适当的时候开始一个新的事务,在事务完成之后提交或回滚事务,并且在必要的时候进行异常处理。这个接口提供了几个核心方法来控制事务的生命周期,包括开始事务、提交事务和回滚事务。下面是PlatformTransactionManager
接口的基本方法:
TransactionStatus getTransaction(TransactionDefinition definition)
:开始一个新的事务,并返回表示当前事务状态的TransactionStatus
对象。void commit(TransactionStatus status)
:提交事务。void rollback(TransactionStatus status)
:回滚事务。
配置事务管理器
要配置事务管理器,需要首先创建一个实现PlatformTransactionManager
接口的bean,并将其注册到Spring IoC容器中。最常用的是DataSourceTransactionManager
,它适用于基于JDBC的事务。
XML配置示例
如果你的应用程序使用XML配置,可以像下面这样定义事务管理器:
1<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
2 <property name="dataSource" ref="dataSource"/>
3</bean>
4
5<!-- 启用基于注解的事务管理 -->
6<tx:annotation-driven transaction-manager="transactionManager"/>
在这个例子中,transactionManager
bean使用了数据源dataSource
作为其底层的数据访问资源。<tx:annotation-driven>
元素启用了基于@Transactional
注解的事务管理。
Java配置示例
如果你的应用程序使用Java配置,可以像下面这样定义事务管理器:
1@Configuration
2@EnableTransactionManagement
3public class AppConfig {
4
5 @Autowired
6 private DataSource dataSource;
7
8 @Bean
9 public PlatformTransactionManager transactionManager() {
10 return new DataSourceTransactionManager(dataSource);
11 }
12}
在这个例子中,通过@Configuration
类定义了一个PlatformTransactionManager
类型的bean,并通过@EnableTransactionManagement
注解启用了基于注解的事务管理。
使用事务管理器
一旦配置好了事务管理器,就可以通过注解或者显式地在代码中开始、提交或回滚事务。
Spring中的事务控制:
在Spring框架中,用于控制事务的主要注解是@Transactional
。这个注解是最常用的,用来声明一个方法或类需要在事务性的环境中执行,除此之外,还有一些其他注解可能与事务管理间接相关,虽然它们不是直接用于开启事务,但是可以用来控制事务的切面或者在AOP中使用:
- @Transactional - 这是最基础的事务管理注解,它被用来标记类或者具体的方法,表明这些类或者方法需要事务支持。你可以指定不同的属性来控制事务的行为,例如传播行为(propagation)、隔离级别(isolation)、只读(read-only)等。
-
@EnableTransactionManagement - 这个注解通常用于配置类上,以启用基于注解的事务管理。它告诉Spring容器要激活对
@Transactional
注解的支持。 -
@Aspect - 虽然这不是一个事务专用的注解,但是在实现事务切面时可能会用到。通过定义一个带有
@Aspect
注解的类,并结合@Before
、@After
、@Around
等通知注解,你可以创建自定义的事务管理逻辑。 -
@Before
、
@After、
@Around - 这些是AOP的通知类型注解,可以用来编写围绕事务的前置、后置或环绕通知,从而实现更复杂的事务管理逻辑。
除了使用注解的方式外,Spring还提供了几种其他的事务管理方式:
声明式事务管理
1<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
2 <property name="dataSource" ref="dataSource"/>
3</bean>
4<tx:advice id="txAdvice" transaction-manager="transactionManager">
5 <tx:attributes>
6 <tx:method name="find*" read-only="true"/>
7 <tx:method name="get*" read-only="true"/>
8 <tx:method name="*" propagation="REQUIRED"/>
9 </tx:attributes>
10</tx:advice>
11<aop:config>
12 <aop:pointcut id="txPointcut" expression="execution(* com.example.service.*.*(..))"/>
13 <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
14</aop:config>
- 除了
@Transactional
注解之外,还可以通过XML配置文件来声明事务属性。虽然这种方式在Spring 2.x时代较为常见,但在现代应用开发中,基于注解的方式更为流行。
编程式事务管理
1PlatformTransactionManager transactionManager = ...;
2TransactionDefinition transactionDefinition = ...;
3TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
4
5try {
6 // 执行数据库操作
7 ...
8 transactionManager.commit(status);
9} catch (Exception e) {
10 transactionManager.rollback(status);
11}
- 在这种方法中,需要显式地在代码中开始、提交或回滚事务。通常通过获取
PlatformTransactionManager
的实例(也就是事务管理器)并使用它的API来实现的。这种方式适用于那些需要在运行时动态决定是否需要事务的应用场景。