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 上下文容器中即可。
spring boot 或 spring 集成 atomikos jta 完成多数据源事务管理的更多相关文章
- spring+springmvc+mybatis+oracle+atomikos+jta实现多数据源事务管理
---恢复内容开始--- 在做项目过程中,遇到了需要一个项目中访问两个数据库的情况,发现使用常规的spring管理事务,导致事务不能正常回滚,因此,采用了jta+atomikos的分布式数据源方式 ...
- spring boot / cloud (三) 集成springfox-swagger2构建在线API文档
spring boot / cloud (三) 集成springfox-swagger2构建在线API文档 前言 不能同步更新API文档会有什么问题? 理想情况下,为所开发的服务编写接口文档,能提高与 ...
- Spring Boot HikariCP 一 ——集成多数据源
其实这里介绍的东西主要是参考的另外一篇文章,数据库读写分离的. 参考文章就把链接贴出来,里面有那位的代码,简单明了https://gitee.com/comven/dynamic-datasource ...
- Spring Boot系列——如何集成Log4j2
上篇<Spring Boot系列--日志配置>介绍了Spring Boot如何进行日志配置,日志系统用的是Spring Boot默认的LogBack. 事实上,除了使用默认的LogBack ...
- 【ELK】4.spring boot 2.X集成ES spring-data-ES 进行CRUD操作 完整版+kibana管理ES的index操作
spring boot 2.X集成ES 进行CRUD操作 完整版 内容包括: ============================================================ ...
- Spring Boot与Spring MVC集成启动过程源码分析
开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...
- 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 ...
- 14、Spring Boot 2.x 集成 Druid 数据源
14.Spring Boot 2.x 集成 Druid 数据源 完整源码: Spring-Boot-Demos
- 12、Spring Boot 2.x 集成 MongoDB
1.12 Spring Boot 2.x 集成 MongoDB 完整源码: Spring-Boot-Demos
随机推荐
- MySQL:字段约束与索引
字段约束 MySQL的字段约束共四种: 约束名 关键字 描述 主键约束 PRIMARY KEY 字段值唯一,且不能为NULL 非空约束 NOT NULL 字段值不能为NULL 唯一约束 UNIQUE ...
- 【机制】js中的this指向
1.this的使用场景 我们先把this的使用场景分为两大类:函数外和函数内: 函数外的this 就是在全局代码里,直接使用this: "use strict"; let name ...
- Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
http://codeforces.com/problemset/problem/598/D 分析:BFS,同一连通区域的周长一样,但查询过多会导致TLE,所以要将连通区域的答案储存,下次查询到该连通 ...
- 让人头疼的AI bug (随想)
虽然概念上,人工智能和机器学习不等同.但是本文提及的AI,指的是基于机器学习的AI. 一个软件产品,出了错误叫bug,bug需要修.那一个机器学习的模型,准确率在那摆着呢,大伙心知肚明是有一定的犯 ...
- 设计模式(二十四)——职责链模式(SpringMVC源码分析)
1 学校 OA 系统的采购审批项目:需求是 采购员采购教学器材 1) 如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000) 2) 如果金额 小于等于 10000, ...
- FreeBSD ibus输入法框架配置
FreeBSD ibus输入法框架配置 ibus输入法框架配置.xinitrc中增加XIM=ibus; export XIMGTK_IM_MODULE=ibus; export GTK_IM_MODU ...
- C语言入门-mingw64安装+配置
OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...
- android消息线程和消息队列
基于消息队列的线程通信: 消息队列与线程循环 MessageQueue: 利用链表来管理消息. Mess ...
- 一个操作 cookie 的原生方法 cookieStore
我们平时对 cookie 的增删改查等操作,都是在操作 document.cookie,这里我们介绍一个新方法cookieStore. 1. 平时如何操作 cookie document.cookie ...
- 吃透 MQ
本文主要讲解 MQ 的通用知识,让大家先弄明白:如果让你来设计一个 MQ,该如何下手?需要考虑哪些问题?又有哪些技术挑战? 有了这个基础后,我相信后面几篇文章再讲 Kafka 和 RocketMQ 这 ...