前言:对于事务,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 完成多数据源事务管理的更多相关文章

  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. Java数组练习(打印杨辉数组)

    打印杨辉数组 package com.kangkang.array; import java.util.Scanner; public class demo02 { public static voi ...

  2. 如果要是把标记为2的那一行Lable1.Text改为其他的Lable显示执行代码

    转: 如果要是把标记为2的那一行Lable1.Text改为其他的Lable显示执行代码 如图,程序很简单,文件路径也没问题,为什么会报错,百思不得其解?[url]https://book.douban ...

  3. 五十:代码审计-PHP无框架项目SQL注入挖掘技巧

    代码审计教学计划: 审计项目漏洞Demo->审计思路->完整源码框架->验证并利用漏洞 代码审计教学内容: PHP,JAVA网站应用,引入框架类开发源码,相关审计工具及插件使用 代码 ...

  4. php-fpm的慢执行日志

    通过慢执行日志,我们可以清晰地了解PHP脚本在哪里执行时间长,可以定位到行 下面介绍如何开启和查看慢执行日志 #vim /usr/local/php-fpm/etc/php-fpm.d/www.con ...

  5. P2731 骑马修栅栏 Riding the Fences 题解(欧拉回路)

    题目链接 P2731 骑马修栅栏 Riding the Fences 解题思路 存图+简单\(DFS\). 坑点在于两种不同的输出方式. #include<stdio.h> #define ...

  6. ResNet论文笔记

    其实ResNet这篇论文看了很多次了,也是近几年最火的算法模型之一,一直没整理出来(其实不是要到用可能也不会整理吧,懒字头上一把刀啊,主要是是为了将resnet作为encoder嵌入到unet架构中, ...

  7. 2019 GDUT Rating Contest II : Problem F. Teleportation

    题面: Problem F. Teleportation Input file: standard input Output file: standard output Time limit: 15 se ...

  8. salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...

  9. python-顺序串基本操作的实现

    1 #*********************************************************************** ** 2 #> File Name: seq ...

  10. html Ajax连接.NET Ashx

    Html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...