欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring事务管理器

程序员文章站 2022-07-05 18:10:39
...

Spring事务管理器 配置与使用

Spring的事务管理器主要是实现PlatformTransactionManager接口,Spring提供了8个实现类,但是最常用的DataSourceTransactionManager,该类继承了ManagerAbstractPlatformTransactionManager类且ManagerAbstractPlatformTransactionManager类实现了PlatformTransactionManager接口。PlatformTransactionManager接口中有三个方法。一旦配置了事务管理器,事务将交由数据库事务管理器管理事务,不在使用jdbcTemplate来管理管理事务

TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;//获取事务的状态
void commit(TransactionStatus status) throws TransactionException;//进行事务的提交
void rollback(TransactionStatus status) throws TransactionException;//出现异常或着错误时进行事务回滚
  1. XML方式配置事务管理器

    1. 配置时需要在xml配置文件中加入事务管理的命名空间

      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
      
    2. 配置事务管理器需要为事务管理器注入当前配置的数据源组件

      <!--需要在xml配置文件中<beans>元素下添加一下内容-->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!--ref ="dataSource" dataSource是数据源配置时的id-->
      	<property name="dataSource" ref="dataSource"/>
      </bean>
      
  2. java编码方式配置Spring事务管理器

    1. 在配置类需要标注@Configuration@ComponentScan("包的限定名.*")@EnableTransactionManagement(事务驱动管理器)。来告诉Spring这个类是用来配置事务管理器的.此外我们还需要实现TransactionManagementConfigurer接口中的annotationDrivenTransationManager方法。

    2. @Configurer
      @ComponentScan("com.nubi.xxx.*")
      @EnableTransactionManagement
      public class TransactionConfig implements TransactionManagementConfigurer{
      	//数据源
      	private DataSource dataSource = null;
      	
      	//配置数据源
      	@Bean(name="dataSource")
      	public DataSource initDataSource(){
      		if(dataSource != null)
      			return dataSource;
      		//数据源的properties
      		Properties props = new Properties();
      		//配置的数据源参数
      		
      		//创建数据源
      		try{
      			dataSource = BasicDataSourceFactory.createDataSource(props);
      		}catch(Exception e){
      			e.printStackTrace();
      		}
      		return dataSource;
      	}
          
          //配置jdbcTemplate
          @Bean(name="jdbcTemplate")
          public jdbcTemplate initjdbcTemplate(){
              jdbcTemplate jt = new jdbcTemplate();
              jt.setDataSource(initDataSource());
              return jt;
          }
          
          //实现接口的方法,返回数据库事务管理器
          @Bean(name="transactionManager")
          public PlatformTransactionManager annotationDrivenTransationManager(){
              DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();     transactionManager.setDataSource(initDataSource());
              return transactionManager;
          }
      }
      
    3. 需要注意的是,使用了注解@EnableTransactionManagement,在Spring上下文中使用事务注解@Transactional后,Spring就知道使用上面配置的数据源的数据库事务管理器区管理事务。

  3. 编程式事务

  4. 声明式事务

  5. 数据库相关的知识

    1. 数据库事务ACID特性

    2. 丢失更新

    3. 隔离级别

  6. 选择事务隔离级别传播行为

    1. 选择隔离级别

    2. 传播行为(传播机制 propagation)

      1. REQUIRED:默认值,若存在一个事务,就支持当前存在的这个事务;否则开启一个新的事务。
      2. REQUIRES_NEW:总是开启一个新的事务,若存在事务,挂起存在的事务。开始新的事务执行方法。
      3. MANDATORY:若存在一个事务,就支持该事务;若当前没有一个活动的事务,就抛出异常。
      4. NESTED:若当前存在一个事务,则创建一个事务作为当前事务的一个嵌套事务运行;若没有事务,该传播行为与REQUIRED一致。
      5. SUPPORTS:若当前事务不存在则以非事务方式执行,否则支持当前事务。
      6. NOT_SUPPORTED:总是以非事务方式执行。若事务存在,则挂起当前事务,然后在执行方法。
      7. NEVER:总是以非事务的方式执行。若存在一个活动的事务,就抛出异常
    3. 配置事务管理器的事务属性

      <!--transaction-manager该属性是指定事务管理,如果Transaction的Bean的name值"transactionManager"可以省略,因为这是transaction-manager属性的默认值-->
      <tx:advice id="txAdvice" transaction-manager="transactionManager">
          <tx:attributes>
              <!--name属性是必须的,用来指定匹配的方法。可以使用通配符“*”进行匹配符合规则的方法。
      		可以配置多个<tx:method/>标签
      表示以find开头的方法-->
              <tx:method name="search*" propagation="SUPPORTS"/>
              <tx:method name="del*" propagation="REQUIRED"/>
              <tx:method name="update*" propagation="REQUIRED"/>
              <tx:method name="create*" propagation="REQUIRED"/>
          </tx:attributes>
      </tx:advice>
      
    4. 还可以通过注解方式对方法进行配置传播行为

      @Transaction(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
      public int createUsers(List<User> users){
          //代码。。。
      }
      
  7. Spring与Mybatis组合使用事务

  8. @Transactional的自调用时效问题