• spring boot 或 spring 集成 atomikos jta 完成多数据源事务管理


    前言:对于事务,spring 不提供自己的实现,只是定义了一个接口来供其他厂商实现,具体些的请看我的这篇文章: https://www.cnblogs.com/qiaoyutao/p/11289996.html

    常用的有 jdbc 的DataSourceTransactionManager  , Hibernate的 HibernateTransactionManager  , jta的 JtaTransactionManager 。  但是如果要实现分布式的事务管理就需要借助 atomikos 插件了。

    首先说一下什么是分布式:

      集中式: 就是一个项目就是一个独立的应用,这个项目中包含了各个子模块,比如,邮件功能、文件上传功能等等。最多也就是多部署几个服务器,前面挡上负载均衡来平衡系统负载。

        缺点:不易拓展、更新一个功能就需要重新部署整个项目。 一个子模块出问题就可能影响整个系统的。

        优点:对于开发、测试、运维会比较方便,不用考虑复杂的分布式环境。

      分布式:也就是 若干个 独立功能的计算机的组合,通常做法就是针对一个系统,将系统中的各个业务模块分离开来分别部署到不同的计算机上,来配合工作使系统正常运转的一种系统部署方式,如果某个业务模块负载较高那么就增                          加服务器并挡上负载均衡来缓解压力,但多个服务器仍然是只提供一个业务模块的功能。 但是对于用户是感觉不到的。

        缺点: 对于开发、测试、运维 要考虑复杂的分布式环境,比如分布式事务、分布式锁等。

        优点: 项目的各功能模块独立分开,一个模块更新不影响其他模块。

    下面先说无xml的配置方式,因为用的是spring boot 实在是不想添加xml配置。

    前奏操作: 因为atomikos管理事务是基于 dblink 来实现的,所以要先 以dba角色登录oracle 数据库,通常用户名为 system或者sys    来开启dblink权限。语句如下

    GRANT SELECT ON sys.dba_pending_transactions TO PROD_METADATA;
    GRANT SELECT ON sys.pending_trans$ TO PROD_METADATA;
    GRANT SELECT ON sys.dba_2pc_pending TO PROD_METADATA;
    GRANT EXECUTE ON sys.dbms_xa TO PROD_METADATA;
    GRANT FORCE ANY TRANSACTION TO PROD_METADATA;
    GRANT EXECUTE ON sys.dbms_system TO PROD_METADATA;

    其中 PROD_METADATA 是涉及到分布式事务的用户名,涉及到分布式事务的用户都要开启。

    新建 atomikos 的配置列,创建atomikos 事务管理器示例并交给spring 的JtaTransactionManager 管理

     1 @Configuration
     2 public class AtomikosTxManagerConfig {
     3     
     4     @Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")
     5     public TransactionManager atomikosTransactionManager() {
     6         UserTransactionManager userTransactionManager = new UserTransactionManager();
     7         userTransactionManager.setForceShutdown(true);
     8         return userTransactionManager;
     9     }
    10     
    11     @Bean(name = "userTransaction")
    12     public UserTransaction userTransaction() throws SystemException {
    13         UserTransactionImp userTransactionImp = new UserTransactionImp();
    14         userTransactionImp.setTransactionTimeout(1800000);
    15         return userTransactionImp;
    16     }
    17     
    18     @Bean(name = "txManager")
    19     public PlatformTransactionManager txManager() throws SystemException {
    20         UserTransaction userTransaction = userTransaction();
    21         TransactionManager transactionManager = atomikosTransactionManager();
    22         return new JtaTransactionManager(userTransaction, transactionManager);
    23     }
    24 }

    上面代码已经创建了 名称为 taManager的分布式事务管理器,使用的时候再service 层添加注解 @Transactional(transactionManager = "txManager", rollbackFor = Exception.class)  transactionManager属性指明要使员工的管理器, rollbackFor 指明在什么情况下触发事务回滚。

    当然了,如果不是spring boot ,而是spring 那么就需要进行用xml方式进行aop 配置或者用注解来实现aop事务,xml配置示例如下。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
     7     http://www.springframework.org/schema/beans/spring-beans.xsd
     8     http://www.springframework.org/schema/tx
     9     http://www.springframework.org/schema/tx/spring-tx.xsd
    10     http://www.springframework.org/schema/aop
    11     http://www.springframework.org/schema/aop/spring-aop.xsd">
    12 
    13     <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    14         <property name="transactionManager">
    15             <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
    16                 <property name="forceShutdown" value="true"/>
    17             </bean>
    18         </property>
    19         <property name="userTransaction">
    20             <bean class="com.atomikos.icatch.jta.UserTransactionImp">
    21                 <property name="transactionTimeout" value="1200"/>
    22             </bean>
    23         </property>
    24     </bean>
    25     
    26     <tx:advice id="txAdvice" transaction-manager="txManager">
    27         <tx:attributes>
    28             <tx:method name="persistent*" propagation="REQUIRED" rollback-for="Exception"/>
    29             <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
    30             <tx:method name="*" read-only="true"/>
    31         </tx:attributes>
    32     </tx:advice>
    33     
    34     <aop:config>
    35         <aop:pointcut id="serviceMethods" expression="execution(* com.wisdombud.dama.retl.sync.DataHandling*.*(..))"/>
    36         <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
    37     </aop:config>
    38 </beans>

    然后再通过@ImportResource("classpath:tx.xml")注解  导入配置文件到sping 上下文容器中即可。

       

      

  • 相关阅读:
    java类型与Hadoop类型之间的转换
    Elasticsearch之四种查询类型和搜索原理(博主推荐)
    Eclipse/MyEclipse如何快速提取变量(最强帮手)
    8592 KMP算法
    SDUT 1304-取数字问题(DFS)
    堆排序(小根堆)
    Android显示GIF图片
    HDU 1007 近期点对
    java 显示目录下全部文件
    UVa 11292
  • 原文地址:https://www.cnblogs.com/qiaoyutao/p/11551045.html
Copyright © 2020-2023  润新知