spring 事务管理

346 阅读2分钟

需要完成的步骤

  1. 配置PlatformTransactionManager
    可以直接配置一个DataTransactionManager的bean,这个类是spring提供的专门用于事务管理的
  2. 事务的通知
    也就是配置在哪些方法上使用事务,在这些方法上的事务的一些信息(如:是否只是可读,传播行为,隔离级别等)

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代码:github.com/chenkehao19…

注解配置

  1. 在配置类上加上@EnableTransactionManagement注解,开启事务管理支持
  2. 配置一个@Bean的函数用于返回PlatformTransactionManager对象
    @Bean
    public DataSourceTransactionManager createDataSourceTransactionManager(DataSource dataSource){
        System.out.println("DataSourceTransactionManager");
        DataSourceTransactionManager manager = new DataSourceTransactionManager();
        manager.setDataSource(dataSource);
        return manager;
    }
  1. 给需要配置事务的函数上加上@Transactional(这个函数必须是public的),也可以直接放在类上,表示类里所有的public函数都支持事务
    完整Demo代码:github.com/chenkehao19…