• 在Spring多数据源中事务管理


     

     今天在做Spring3+MyBatic3项目中,使用事务管理数据插入。但在异常情况下不回滚,
    找了会才发现原来是在配置事务管理器DataSourceTransactionManager时配置的数据源是另一个库的数据源。

    <bean id="transactionManagerLte" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSourceLte" />
    </bean>
    
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = txManager.getTransaction(def);
    	try {
    		lteTeleDAO.insertLteTfjProdServ(dtos);
    		lteTeleDAO.insertTfjGroup(tfjGroupDto);
    		txManager.commit(status);
    	} catch (Exception e) {
               txManager.rollback(status);
         }
    

    以上为背景,介绍点Spring事务

    1,使用Spring编程时事务管理时,一般步骤

    1. 在Spring 配置文件中配置 DataSourceTransactionMananger(上述)
    2. 在代码中从获取IOC容器PlatformTransactionManager实例(步骤一bean)
    3. 通过PlatformTransactionManager.getTransaction()开始一个事务,返回TransactionStatus对象
    4. 在需要一致性处理数据库外,try...catch..
    5. 正常流程中,PlatformTransaction.commit(TransactionStatus),异常发生时,调用PlatformTransaction.rollback(TransactionStatus)

    2,Spring的PlatformTransactionManager是如何与底层数据源关联起来的

    开篇部分,使用JDBC数据源,事务也是JDBC事务。在配置文件中仅仅是把DataSourceTransactionManager(事务管理器)和BasicDataSource(数据库连接池)关联起来,

    而正真的JDBC事务必须和一个JDBC Connection管理起来。

    事例:

    try{
      TransactionStatus ts = PlatformTransaction.getTransaction(..);
    
      Connection conn = dataSource.getConnection();
      conn insert ....
      platformTransaction.commint(ts);
    
    }catch(Exception e){ platformTransaction.rollback(ts); }

    本事例中事务是管不住Connection的,为啥?

     这是因为dataSource.getConnection(),获取的数据库连接与PlatformTransactionMnanger启动事务时,关联的数据库连接不是同一个Connection。

    不是一个通道,怎么能控制呢。

    可以使用Spring 提供的DataSourceUtils.getConnection(datasource) 返回 和PlatformTransactionManager关联的Connection。

    在PlatformTransaction启动事务时会将当前事务的连接注册到TransactionSynchronizationManager,DataSourceUtils也将首先试图从TransactionSynchronizationManager中获取已经关联到当前事务的Connection。

  • 相关阅读:
    创建zull工程时pom文件报错failed to read artifact descriptor for org.springframework.cloud:spring-cloud
    利用eureka构建一个简单的springCloud分布式集群
    《信息安全专业导论》第十一周学习总结
    Nmap
    Excel数据统计与分析
    python模拟进程状态
    《信息安全专业导论》第9周学习总结
    俄罗斯方块
    《信息安全专业导论》第八周学习总结
    熟悉编程语言
  • 原文地址:https://www.cnblogs.com/lh-V/p/4242374.html
Copyright © 2020-2023  润新知