今天介绍分布式事务XA协议,单个服务操作多个数据源,引入Atomikos  相关jar,进行实站演示,先说XA协议规范原理:

XA是由X/Open组织提出的分布式事务的规范。 XA规范主要定义了(全局)事务管理器(TM) 和(局部)资源管理器(RM)之间的接口。主流的关系型数据库产品都是实现了XA接口的。 XA接口是双向的系统接口,在事务管理器(TM)以及一个或多个资源管理器(RM)之间形成通信桥梁。 XA之所以需要引入事务管理器是因为,在分布式系统中,从理论上讲两台机器理论上无法达成一致的状态,需要引入一个单点进行协调。 由全局事务管理器管理和协调的事务,可以跨越多个资源(如数据库或JMS队列)和进程。全局事务管理器一般使用XA二阶段提交协议与数据库进行交互。下面进入实战:

1、springBoot项目引入jar

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

2、核心业务代码

import com.enjoy.service.TransferService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class XATransferServiceServiceImpl implements TransferService{@Autowired@Qualifier("nanJdbcTemplate")private JdbcTemplate jamesJdbcTemplate;@Autowired@Qualifier("daoJdbcTemplate")private JdbcTemplate peterJdbcTemplate;@Transactionalpublic String transfer(int money) {int resultNan = jamesJdbcTemplate.update("INSERT INTO bank_a(money,user_name)VALUES (?,?)",-money,"james");int resultDao = peterJdbcTemplate.update("INSERT INTO bank_b(money,user_name)VALUES (?,?)",money,"peter");if (money > 200){throw new RuntimeException("money too large");//大于200后就回滚,以上两条sql操作无效}return resultNan+"-"+resultDao;}}

3、多数据源配置核心代码

import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.jta.JtaTransactionManager;import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import java.util.Properties;@Configuration
public class XADataSourceConfig {@Autowiredprivate Environment env;@Bean(name = "nanDataSource")//第一个数据源@Primarypublic DataSource jamesDataSource(Environment env) {AtomikosDataSourceBean ds = new AtomikosDataSourceBean();ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");ds.setUniqueResourceName("nanDB");ds.setPoolSize(5);ds.setXaProperties(build("spring.datasource.druid.jamesDB."));return ds;}@Bean(name = "daoDataSource")//第二个数据源public DataSource peterDataSource(Environment env) {AtomikosDataSourceBean ds = new AtomikosDataSourceBean();Properties prop = build("spring.datasource.druid.peterDB.");ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");ds.setUniqueResourceName("daoDB");ds.setPoolSize(5);ds.setXaProperties(prop);return ds;}@Bean("nanJdbcTemplate")//数据源实例public JdbcTemplate jamesJdbcTemplate(@Qualifier("nanDataSource") DataSource ds) {return new JdbcTemplate(ds);}@Bean("daoJdbcTemplate")//数据源实例public JdbcTemplate peterJdbcTemplate(@Qualifier("daoDataSource") DataSource ds) {return new JdbcTemplate(ds);}@Bean//创建事务管理器public JtaTransactionManager regTransactionManager () {UserTransactionManager userTransactionManager = new UserTransactionManager();UserTransaction userTransaction = new UserTransactionImp();return new JtaTransactionManager(userTransaction, userTransactionManager);}private Properties build(String prefix) {Properties prop = new Properties();prop.put("url", env.getProperty(prefix + "url"));prop.put("username", env.getProperty(prefix + "username"));prop.put("password", env.getProperty(prefix + "password"));return prop;}

4、大家可以模拟进行操作了,这种XA协议对资源锁定力度比较大,同时锁两张表数据源,单体服务或并发量不高的服务完全没问题,但是不适合复杂的微服务场景,可以反复测试一下。下篇我们介绍LCN框架,敬请期待!

分布式事务之 Atomikos 原理和使用(一)相关推荐

  1. mysql2阶段提交具体实现_ShardingSphere 4.x 分布式事务之实现原理

    导览 本小节主要介绍ShardingSphere分布式事务的实现原理 两阶段XA事务 Seata柔性事务 两阶段事务-XA 实现原理 实现原理 ShardingSphere里定义了分布式事务的SPI接 ...

  2. 分布式事务架构设计原理

    随着业务需求的复杂化,企业应用规模不断扩大,在后端开发中经常会遇到以下问题: 业务的并发要求非常高,对应的业务需要通过微服务拆分,甚至分库分表等架构设计才能满足并发需求,此时业务操作无法在同一个数据库 ...

  3. 阿里分布式事务框架Seata原理解析

    阿里分布式事务框架Seata原理解析 作者:伊凡的一天 链接:https://www.jianshu.com/p/044e95223a17 Seata框架是一个业务层的XA(两阶段提交)解决方案.在理 ...

  4. 分布式事务解决方案和原理

    分布式事务解决方案和原理 一. 背景: 我们知道, 在以前的 all-in-one 的项目开发模式下, 所有事务问题都是本地事务问题, 基本上利用mysql的优化方案和java提供的API, 可以解决 ...

  5. 【网站架构】一招搞定90%的分布式事务,实打实介绍数据库事务、分布式事务的工作原理应用场景

    大家好,欢迎来到停止重构的频道.本期,我们来聊一下数据库事务以及分布式事务. 大家都在强调事务的重要性,而分布式事务也说是微服务必备的.但又说事务会影响性能,分布式事务更是很复杂的东西.使得大家都很迷 ...

  6. Redis分布式事务锁的原理(上)

    我们在单机服务器,出现资源的竞争,一般使用synchronized 就可以解决,但是在分布式的服务器上,synchronized 就无法解决这个问题,这就需要一个分布式事务锁. 除此之外面试,基本会问 ...

  7. 分布式事务--TCC--流程/原理

    原文网址:分布式事务--TCC--流程/原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍TCC分布式事务解决方案的流程及原理. 流程 详解 业务操作分两阶段完成 如下图所示,接入TCC前,业务操 ...

  8. 分布式事务框架Seata原理详解

    本文来深度解析下分布式事务框架Seata原理,知其然知其所以然. 文章目录 Seata概述 什么是2PC二阶段提交协议 MySQL XA方案 Seata核心知识 Seata设计目标 Seata组成结构 ...

  9. TCC分布式事务的实现原理

    目录 一.写在前面 二.业务场景介绍 三.进一步思考 四.落地实现TCC分布式事务 (1)TCC实现阶段一:Try (2)TCC实现阶段二:Confirm (3)TCC实现阶段三:Cancel 五.总 ...

最新文章

  1. 《Haskell并行与并发编程》——第2章,第2.1节惰性求值和弱首范式
  2. ML基石_1_LearningProblem
  3. 【风控流程】大数据风控代码逻辑
  4. python绘制正态分布函数_学好正态分布有多重要?
  5. outlook vba开发要点
  6. MVC Areas的使用
  7. linux中端口的欺骗,Linux中的端口占用问题
  8. C++ —— C++运算符与表达式
  9. html5播放器 迅雷,搜狗浏览器HTML5视频播放器插件(HTML5.Video.Player)
  10. java大作业斗地主游戏_Java集合练习:斗地主游戏
  11. Java系列之XML
  12. mysql s索引 树_mysql 学习 - B+树索引
  13. html微信图片自适应,微信小程序实现图片高度自适应
  14. 短信、邮件、通讯录、蓝牙、社交、Game Center、应用内购买、iClould、Passbook
  15. Sun Java认证考试介绍
  16. 最全介绍的代理模式---第一节-静态代理
  17. Vue项目中使用海康安全生产平台播放监控视频
  18. Leetcode之无重复字符的最长字符串
  19. java heritrix_Heritrix 和 Nutch 比较与分析(java开源网络爬虫)
  20. ssm Java试题库管理系统 maven

热门文章

  1. python棋盘放米问题_棋盘堆米的难题怎么解决?
  2. 高精度② P1601 A+B Problem
  3. linux ajp集群,Tomcat6_Apache2.2_ajp负载均衡加集群实战
  4. java项目——淘宝商城
  5. matlab中索引超过维度,索引超出维度,怎么处理
  6. 保姆级——Java调用百度OCR实现身份证识别
  7. C语言实现稀硫矩阵的三元组表示及其转置
  8. 照片jpg大小kb如何修改?图片在线压缩大小怎么处理?
  9. Ameya360:安森美成像技术开启数字电影摄影新纪元
  10. wifi ota 信道测试