分布式事务之 Atomikos 原理和使用(一)
今天介绍分布式事务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 原理和使用(一)相关推荐
- mysql2阶段提交具体实现_ShardingSphere 4.x 分布式事务之实现原理
导览 本小节主要介绍ShardingSphere分布式事务的实现原理 两阶段XA事务 Seata柔性事务 两阶段事务-XA 实现原理 实现原理 ShardingSphere里定义了分布式事务的SPI接 ...
- 分布式事务架构设计原理
随着业务需求的复杂化,企业应用规模不断扩大,在后端开发中经常会遇到以下问题: 业务的并发要求非常高,对应的业务需要通过微服务拆分,甚至分库分表等架构设计才能满足并发需求,此时业务操作无法在同一个数据库 ...
- 阿里分布式事务框架Seata原理解析
阿里分布式事务框架Seata原理解析 作者:伊凡的一天 链接:https://www.jianshu.com/p/044e95223a17 Seata框架是一个业务层的XA(两阶段提交)解决方案.在理 ...
- 分布式事务解决方案和原理
分布式事务解决方案和原理 一. 背景: 我们知道, 在以前的 all-in-one 的项目开发模式下, 所有事务问题都是本地事务问题, 基本上利用mysql的优化方案和java提供的API, 可以解决 ...
- 【网站架构】一招搞定90%的分布式事务,实打实介绍数据库事务、分布式事务的工作原理应用场景
大家好,欢迎来到停止重构的频道.本期,我们来聊一下数据库事务以及分布式事务. 大家都在强调事务的重要性,而分布式事务也说是微服务必备的.但又说事务会影响性能,分布式事务更是很复杂的东西.使得大家都很迷 ...
- Redis分布式事务锁的原理(上)
我们在单机服务器,出现资源的竞争,一般使用synchronized 就可以解决,但是在分布式的服务器上,synchronized 就无法解决这个问题,这就需要一个分布式事务锁. 除此之外面试,基本会问 ...
- 分布式事务--TCC--流程/原理
原文网址:分布式事务--TCC--流程/原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍TCC分布式事务解决方案的流程及原理. 流程 详解 业务操作分两阶段完成 如下图所示,接入TCC前,业务操 ...
- 分布式事务框架Seata原理详解
本文来深度解析下分布式事务框架Seata原理,知其然知其所以然. 文章目录 Seata概述 什么是2PC二阶段提交协议 MySQL XA方案 Seata核心知识 Seata设计目标 Seata组成结构 ...
- TCC分布式事务的实现原理
目录 一.写在前面 二.业务场景介绍 三.进一步思考 四.落地实现TCC分布式事务 (1)TCC实现阶段一:Try (2)TCC实现阶段二:Confirm (3)TCC实现阶段三:Cancel 五.总 ...
最新文章
- 《Haskell并行与并发编程》——第2章,第2.1节惰性求值和弱首范式
- ML基石_1_LearningProblem
- 【风控流程】大数据风控代码逻辑
- python绘制正态分布函数_学好正态分布有多重要?
- outlook vba开发要点
- MVC Areas的使用
- linux中端口的欺骗,Linux中的端口占用问题
- C++ —— C++运算符与表达式
- html5播放器 迅雷,搜狗浏览器HTML5视频播放器插件(HTML5.Video.Player)
- java大作业斗地主游戏_Java集合练习:斗地主游戏
- Java系列之XML
- mysql s索引 树_mysql 学习 - B+树索引
- html微信图片自适应,微信小程序实现图片高度自适应
- 短信、邮件、通讯录、蓝牙、社交、Game Center、应用内购买、iClould、Passbook
- Sun Java认证考试介绍
- 最全介绍的代理模式---第一节-静态代理
- Vue项目中使用海康安全生产平台播放监控视频
- Leetcode之无重复字符的最长字符串
- java heritrix_Heritrix 和 Nutch 比较与分析(java开源网络爬虫)
- ssm Java试题库管理系统 maven