前言:对于事务,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. springboot整合jsp,完成公交车站路线图

    转: springboot整合jsp,完成公交车站路线图 点赞再看,养成习惯 开发环境: jdk 8 intellij idea tomcat 8 mysql 5.7 maven 3.6 所用技术: ...

  2. 基于Hi3559AV100 RFCN实现细节解析-(2)RFCN数据流分析

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...

  3. PTA甲级—常用技巧与算法

    散列 1078 Hashing (25 分) Quadratic probing (with positive increments only) is used to solve the collis ...

  4. 在Linux中安装MariaDB并添加远程访问

    在Linux中安装MariaDB并添加远程访问 最近学习到了数据库部分,因为有一台台式机一台笔记本换着用,就没有把数据库安装在本机,本来打算用之前买的虚拟空间的数据库的,结果速度太慢用起来太难受了,就 ...

  5. Nmap命令使用方法

          Nmap使用合集 感谢博主:VVVinson    文章链接:https://www.cnblogs.com/Vinson404/p/7784829.html 参    数 说    明 ...

  6. java将一个list转换成一个String,中间用分隔符隔开

    List sn=[123,1231,1231,231] sn.toString();//[123,1231,1231,231] sn.join(',').toString();//123,1231,1 ...

  7. java实现下载器(以及创建一个URL对象)

    java实现下载器(以及创建一个URL对象) 1.思路讲解: (1)注意路径:是网络路径噢 (2)创建创建网路协议对象(远程对象):HttpURLConnection urlConnection (3 ...

  8. python基础学习之深浅复制的概念

    1.深浅复制 浅复制,python自带,深复制需要导入模块包 import copy 使用深浅复制,根据id不同写出他们的区别a = [1,2,3]b = [6,7,8]s1 = [a,b]print ...

  9. vim宏录制的操作

    1:在vim编辑器normal模式下输入qa(其中a为vim的寄存器) 2:此时在按i进入插入模式,vim编辑器下方则会出现正在录制字样,此时便可以开始操作. 3:需要录制的操作完成后,在normal ...

  10. 写了一个 gorm 乐观锁插件

    前言 最近在用 Go 写业务的时碰到了并发更新数据的场景,由于该业务并发度不高,只是为了防止出现并发时数据异常. 所以自然就想到了乐观锁的解决方案. 实现 乐观锁的实现比较简单,相信大部分有数据库使用 ...