zoukankan      html  css  js  c++  java
  • 在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。

  • 相关阅读:
    比较两个DataTable数据(结构相同),返回新增的,删除的,修改前的,修改后的 DataTable
    通用jig类,用到委托
    网站性能优化之HTTP请求过程简述!
    常见JS效果实现实现之图片减速度滚动
    Firefox中实现的outerHTML
    电子商务网站上的常用的放大镜效果
    div背景半透明,覆盖整个可视区域的遮罩层效果
    Javascript类定义语法,私有成员、受保护成员、静态成员等
    HTML/CSS控制div垂直&&水平居中屏幕
    CSS团队协作开发方式的思考
  • 原文地址:https://www.cnblogs.com/lh-V/p/4242374.html
Copyright © 2011-2022 走看看