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

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

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

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

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

   

  

spring boot 或 spring 集成 atomikos jta 完成多数据源事务管理的更多相关文章

  1. spring+springmvc+mybatis+oracle+atomikos+jta实现多数据源事务管理

    ---恢复内容开始---   在做项目过程中,遇到了需要一个项目中访问两个数据库的情况,发现使用常规的spring管理事务,导致事务不能正常回滚,因此,采用了jta+atomikos的分布式数据源方式 ...

  2. spring boot / cloud (三) 集成springfox-swagger2构建在线API文档

    spring boot / cloud (三) 集成springfox-swagger2构建在线API文档 前言 不能同步更新API文档会有什么问题? 理想情况下,为所开发的服务编写接口文档,能提高与 ...

  3. Spring Boot HikariCP 一 ——集成多数据源

    其实这里介绍的东西主要是参考的另外一篇文章,数据库读写分离的. 参考文章就把链接贴出来,里面有那位的代码,简单明了https://gitee.com/comven/dynamic-datasource ...

  4. Spring Boot系列——如何集成Log4j2

    上篇<Spring Boot系列--日志配置>介绍了Spring Boot如何进行日志配置,日志系统用的是Spring Boot默认的LogBack. 事实上,除了使用默认的LogBack ...

  5. 【ELK】4.spring boot 2.X集成ES spring-data-ES 进行CRUD操作 完整版+kibana管理ES的index操作

    spring boot 2.X集成ES 进行CRUD操作  完整版 内容包括: ============================================================ ...

  6. Spring Boot与Spring MVC集成启动过程源码分析

    开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...

  7. 15、Spring Boot 2.x 集成 Swagger UI

    1.15.Spring Boot 2.x 集成 Swagger UI 完整源码: Spring-Boot-Demos 1.15.1 pom文件添加swagger包 <swagger2.versi ...

  8. 14、Spring Boot 2.x 集成 Druid 数据源

    14.Spring Boot 2.x 集成 Druid 数据源 完整源码: Spring-Boot-Demos

  9. 12、Spring Boot 2.x 集成 MongoDB

    1.12 Spring Boot 2.x 集成 MongoDB 完整源码: Spring-Boot-Demos

随机推荐

  1. MySQL:字段约束与索引

    字段约束 MySQL的字段约束共四种: 约束名 关键字 描述 主键约束 PRIMARY KEY 字段值唯一,且不能为NULL 非空约束 NOT NULL 字段值不能为NULL 唯一约束 UNIQUE ...

  2. 【机制】js中的this指向

    1.this的使用场景 我们先把this的使用场景分为两大类:函数外和函数内: 函数外的this 就是在全局代码里,直接使用this: "use strict"; let name ...

  3. Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum

    http://codeforces.com/problemset/problem/598/D 分析:BFS,同一连通区域的周长一样,但查询过多会导致TLE,所以要将连通区域的答案储存,下次查询到该连通 ...

  4. 让人头疼的AI bug (随想)

    虽然概念上,人工智能和机器学习不等同.但是本文提及的AI,指的是基于机器学习的AI.   一个软件产品,出了错误叫bug,bug需要修.那一个机器学习的模型,准确率在那摆着呢,大伙心知肚明是有一定的犯 ...

  5. 设计模式(二十四)——职责链模式(SpringMVC源码分析)

    1 学校 OA 系统的采购审批项目:需求是 采购员采购教学器材 1) 如果金额 小于等于 5000,  由教学主任审批 (0<=x<=5000) 2) 如果金额 小于等于 10000,   ...

  6. FreeBSD ibus输入法框架配置

    FreeBSD ibus输入法框架配置 ibus输入法框架配置.xinitrc中增加XIM=ibus; export XIMGTK_IM_MODULE=ibus; export GTK_IM_MODU ...

  7. C语言入门-mingw64安装+配置

    OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...

  8. android消息线程和消息队列

    基于消息队列的线程通信:           消息队列与线程循环            MessageQueue:           利用链表来管理消息.                  Mess ...

  9. 一个操作 cookie 的原生方法 cookieStore

    我们平时对 cookie 的增删改查等操作,都是在操作 document.cookie,这里我们介绍一个新方法cookieStore. 1. 平时如何操作 cookie document.cookie ...

  10. 吃透 MQ

    本文主要讲解 MQ 的通用知识,让大家先弄明白:如果让你来设计一个 MQ,该如何下手?需要考虑哪些问题?又有哪些技术挑战? 有了这个基础后,我相信后面几篇文章再讲 Kafka 和 RocketMQ 这 ...