关于spring boot 支持分布式事务,XA是常用的一种方式。

这里把相关的配置记下,方便以后使用。

首先配置两个不同的数据源 : 订单库、持仓库。

/**
* Created by zhangjunwei on 2017/8/2.
*/
@Configuration
public class DataSourceConfig { /**
* db1的 XA datasource
*
* @return
*/
@Bean(name = "symbolOrder")
@Primary
@Qualifier("symbolOrder")
public AtomikosDataSourceBean symbolOrderBean() {
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setUniqueResourceName("symbolOrder");
atomikosDataSourceBean.setXaDataSourceClassName(
"com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
Properties properties = new Properties();
properties.put("URL","jdbc:mysql://localhost:3306/datamanage");
properties.put("user", "root");
properties.put("password", "123456");
atomikosDataSourceBean.setXaProperties(properties);
return atomikosDataSourceBean;
} /**
* db2的 XA datasource
*
* @return
*/
@Bean(name = "symbolPosition")
@Qualifier("symbolPosition")
public AtomikosDataSourceBean symbolPositionDataSourceBean() {
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setUniqueResourceName("symbolPosition");
atomikosDataSourceBean.setXaDataSourceClassName(
"com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
Properties properties = new Properties();
properties.put("URL", "jdbc:mysql://localhost:3306/symbol_position");
properties.put("user", "root");
properties.put("password", "123456");
atomikosDataSourceBean.setXaProperties(properties);
return atomikosDataSourceBean;
} /**
* transaction manager
*
* @return
*/
@Bean(destroyMethod = "close", initMethod = "init")
public UserTransactionManager userTransactionManager() {
UserTransactionManager userTransactionManager = new UserTransactionManager();
userTransactionManager.setForceShutdown(true);
return userTransactionManager;
} /**
* jta transactionManager
*
* @return
*/
@Bean
public JtaTransactionManager transactionManager() {
JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
jtaTransactionManager.setTransactionManager(userTransactionManager());
return jtaTransactionManager;
} }

顺便把相关的依赖贴上,值得注意的是  spring-boot-starter-jta-atomikos 依赖,这是一个开源的事务管理器类。

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
</dependencies>

  

以上就是全部配置了。接着我们来写测试用例,看下效果怎么样。

模拟场景:用户下单成功后,他的账户持仓应该对应增加,如果持仓更新失败,则他的下单操作也需要回滚。

/**
* Created by zhangjunwei on 2017/8/2.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = UserManageStart.class)
public class DataSouceTest {
@Autowired
@Qualifier("symbolOrder")
private AtomikosDataSourceBean symbolOrder; @Autowired
@Qualifier("symbolPosition")
private AtomikosDataSourceBean symbolPosition; @Transactional
@Test
public void test() { Connection orderConnection = null;
Connection positionConnection = null;
try {
orderConnection = symbolOrder.getConnection();
String sql = "insert into order_symbol (accountId,symbol,amount,price,orderTime) values " +
"({0},''{1}'',{2},{3},''{4}'')";
sql = MessageFormat.format(sql,4,"000004.SZ",100,(float)5.5,"2017-07-27 14:31:00");
PreparedStatement orderStatement = orderConnection.prepareStatement(sql);
orderStatement.execute(); positionConnection = symbolPosition.getConnection();
sql = "insert into hq_position (accountId,symbol,amount) values " +
"({0},''{1}'',{2})";
sql = MessageFormat.format(sql,4,"000002.SZ",200);
PreparedStatement positionStatement = positionConnection.prepareStatement(sql);
positionStatement.execute();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (orderConnection != null) {
orderConnection.close();
}
if (positionConnection != null) {
positionConnection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} }

  

spring boot 分布式事务实现(XA方式)的更多相关文章

  1. j2ee中spring的分布式事务实现及解决方案

    1 java事务类型 Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供 ...

  2. Spring Cloud 分布式事务管理

    Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring Clo ...

  3. spring boot 分布式session实现

    spring boot 分布式session实现 主要是通过包装HttpServletRequest将session相关的方法进行代理. 具体是的实现就是通过SessionRepositoryFilt ...

  4. spring boot分布式技术,spring cloud,负载均衡,配置管理器

    spring boot分布式的实现,使用spring cloud技术. 下边是我理解的spring cloud的核心技术: 1.配置服务器 2.注册发现服务器eureka(spring boot默认使 ...

  5. 运行 Spring Boot 应用的 3 种方式

    今天介绍 3 种运行 Spring Boot 应用的方式,看大家用过几种? 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 ...

  6. Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式

    前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是E ...

  7. Spring Boot 支持多种外部配置方式

    Spring Boot 支持多种外部配置方式 http://blog.csdn.net/isea533/article/details/50281151 这些方式优先级如下: 命令行参数 来自java ...

  8. Spring Boot 项目几种启动方式

    Spring Boot 项目几种启动方式 1. 使用 main 启动 jar xxxx.jar 2. 使用 mvn 启动 mvn spring-boot:run 3. 使用 Spring Boot c ...

  9. 分布式事务、XA、两阶段提交、一阶段提交

    本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...

随机推荐

  1. 蓝牙inquiry流程之命令下发

    Android 上面的蓝牙inquiry 是在设置界面,打开蓝牙就会自动搜索周边的蓝牙设备,其最终调用到协议栈的start_discovery接口,此篇文章分析该接口的调用流程以及与controlle ...

  2. SSIS 组件属性整理

    整理SSIS 组件的属性解释及其用法 一,ExecValueVariable属性 有些Task组件执行完成之后,会产生输出结果,称作Execution Value,例如,Execute SQL Tas ...

  3. Java使用Redis学习笔记

    如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <dependency ...

  4. 关于Map迭代循环,key和value的顺序问题

    使用Hashtable,keySet()返回的顺序为降序(key降顺序) ---->6, 5, 4, 3, 2, 1使用TreeMap,keySet()返回的顺序为升序(key升顺序) ---- ...

  5. Linux_02

    1.vim编辑器 vim操作命令 --在命令模式下进行 pageup 往上翻页 pagedown 往下翻页 H 移动到屏幕首行 gg 移动光标到文档的首行 前面加数字n表示移动到n行内容 G 移动到文 ...

  6. cf 1029D

    题面 题目描述 给定含n个整数的数组a. 规定数x,y的合并为xy.如:数12与数3456的合并为数123456. 有数组中的位置对(i,j)(i≠j),计算使ai,aj的合并能被k整除的位置对数量. ...

  7. A1020. Tree Traversals(25)

    这是一题二叉树遍历的典型题,告诉我们中序遍历和另外一种遍历序列,然后求任何一种遍历序列. 这题的核心: 建树 BFS #include<bits/stdc++.h> using names ...

  8. Linux内核分析— —计算机是如何工作的(20135213林涵锦)

    实验部分 (以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码, int g(i ...

  9. 第二阶段冲刺——four

    个人任务: 季方:实现团队博客作业查询. 王金萱:优化统计团队博客结果界面的显示. 马佳慧:选择功能界面的背景设计. 司宇航:用servlet完成名单打印功能. 站立会议: 任务看板和燃尽图:

  10. 第二阶段Sprint7

    昨天:将“录制”及“保存”整合到一起,修复出现的Bug,使之能够正常运行. 今天:把视频录制整合到时间提醒里,实现视频提醒 遇到的问题:额,整进去直接就停止运行了..也没有报错..