• 在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。

  • 相关阅读:
    Oracle学习
    WPF中获取DataGrid列表的选中行Id的方法
    调用MySql存储过程的方法 '增删改查'
    MySql中存储过程的基本增删改查操作
    在WinForm中遍历获取TreeView的节点及其子节点
    WinForm获取MySql数据的基本增删改查
    WinForm中的用户控件实现分页功能
    NGUI之自适应屏幕
    快速排序法
    Array,ArrayList、List<T>、HashSet<T>、LinkedList<T>与Dictionary<K,V>
  • 原文地址:https://www.cnblogs.com/lh-V/p/4242374.html
Copyright © 2020-2023  润新知