spring 事务管理
需要完成的步骤
- 配置PlatformTransactionManager
可以直接配置一个DataTransactionManager的bean,这个类是spring提供的专门用于事务管理的 - 事务的通知
也就是配置在哪些方法上使用事务,在这些方法上的事务的一些信息(如:是否只是可读,传播行为,隔离级别等)
PlatformTransactionManager介绍
- 实现类:org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或MyBatis 进行持久化数据时使用
- 实现类:org.springframework.orm.hibernate5.HibernateTransactionManager 使用Hibernate版本进行持久化数据时使用
- 配置spring的事务管理对象
- 需要的参数:DataSource
xml配置
需要将事务管理和aop切入点结合起来一起用,切入点用于配置相应的需要加入事务的方法,事务配置里面可以对这些方法进行更加细粒度的划分
相关的配置如下
<!--配置PlatformTransactionManager-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionalManager" >
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionalManager">
<tx:attributes>
<tx:method name="*" read-only="false" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true" propagation="SUPPORTS"></tx:method>
</tx:attributes>
</tx:advice>
<!--将事务的通知与aop切入点结合-->
<aop:config>
<aop:pointcut id="transactionpointcut" expression="execution(* com.kehao.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionpointcut"></aop:advisor>
</aop:config>
标签的解释
- 事务配置
<tx:advice>
通知标签 - 属性id:自定义唯一表示
- transaction-manager属性:事务管理类,配置事务管理类的id属性值
- 事务属性配置
<tx:attributes>
子标签<tx:method>
事务方法标签- 属性name:方法名
- 属性read-only:是否只读事务,查询都是只读,其他是非只读; 默认配置为false
- 属性propagation:事务的传播行为,默认配置REQUIRED或者SUPPORTS
- 属性isolation:事务隔离级别,默认配置DEFAULT
- 属性timeout:事务超时时间,配置-1
- 属性no-rollback-for:遇到什么异常不回滚,配置异常类名,多个类逗号分开
- 属性rollback-for:遇到什么异常回滚
- 以上回滚属性不配置,遇到异常就回滚
- aop切面配置
<aop:config>
标签<aop:advisor>
子标签- 属性advice-ref:引用通知(增强),配置tx:advice标签的属性值
- 属性pointcut:切点配置
完整demo代码:https://github.com/chenkehao1998/JavaExampleForBlog/tree/main/kehao_spring_aop_transactional_xml
注解配置
- 在配置类上加上
@EnableTransactionManagement
注解,开启事务管理支持 - 配置一个
@Bean
的函数用于返回PlatformTransactionManager对象
@Bean
public DataSourceTransactionManager createDataSourceTransactionManager(DataSource dataSource){
System.out.println("DataSourceTransactionManager");
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
- 给需要配置事务的函数上加上
@Transactional
(这个函数必须是public的),也可以直接放在类上,表示类里所有的public
函数都支持事务
完整Demo代码:https://github.com/chenkehao1998/JavaExampleForBlog/tree/main/kehao_spring_aop_transactional_anno