SpringBoot之JPA框架下如何使用JTA——分布式事务解决方案
以前,笔者写过一篇博客,支付宝DTS方案,当然,只是仅仅是简单讨论了下分布式事务的解决方案。PS:笔者看了下相关评论,发现由于太简单,被不少人Diss了一通。
最近,笔者在自己的工程上,试图一次性解决分布式事务问题。
笔者自身的工程,目前是Springboot作为基本框架,以JPA作为数据库操作工作。笔者首先想到的,是如何利用现有框架,以及成熟的方案,做一个分布式解决方案。
然后,查了一段时间,发现JTA解决方案。
然后发现Atomikos,就用Atomikos作为核心解决方案。
发现JTA解决分布式方案的思想,是对事务进行托管。因为单独一个事务,本身是ACID的;两个事务,却不能做到同时ACID。可行方案是TCC或两阶段提交(或三阶段提交)。而对事务进行托管,实际上是让托管程序完成TCC或两阶段提交。
关于分布式解决方案,如果博友想学习,可以参考田守枝的技术博客(分布式事务概述_分布式事务教程_田守枝Java技术博客本文介绍了分布式事务的基础概念,包括本地事务、DTP模型,XA两阶段提交,基于BASE理论的柔性事务等http://www.tianshouzhi.com/api/tutorials/distributed_transaction/383),笔者认为是关于分布式事务里极好的博客。大家可以对分布式事务进行整体认识。
但本篇博客的精髓,在于实现Springboot框架下的分布式事务。
笔者参考了大部分技术博客,发现大部分博客介绍JTA,会把JTA作为一个Repository方式进行增删改查。这种方式的优点是可以简单完成数据库的存储,但缺点是不能较好使用JPA。
一个理想的方法是:单独使用JPA,让JPA可以自用操作数据库。
笔者的实现步骤是:
第一步,更改pom.xml文件,添加依赖库。
<!-- distributed transaction support -->
<dependency><groupId>com.atomikos</groupId><artifactId>transactions-jta</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<dependency><groupId>com.atomikos</groupId><artifactId>transactions-jdbc</artifactId>
</dependency>
第二步,更改Persistence.xml文件;该文件可以用EntityManagerFactory生成EntityManager。
<!--定义持久单元 -->
<persistence-unit name="xxx" transaction-type="JTA"><property name="org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform" value="路径.AtomikosJtaPlatform" />
注意:这里面需要做的是:
1)transaction-type改为JTA;
2)在hibernate4.3以后,JtaPlatform的路径为org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform,之前为hibernate.transaction.jta.platform;
3)AtomikosJtaPlatform的路径必须存在。
第三步,生成AtomikosJtaPlatform文件。
public class AtomikosJtaPlatform extends AbstractJtaPlatform {private static final long serialVersionUID = 1L;static TransactionManager transactionManager;static UserTransaction transaction;@Overrideprotected TransactionManager locateTransactionManager() {return transactionManager;}@Overrideprotected UserTransaction locateUserTransaction() {return transaction;}
}
注意transactionManager即对事务托管的管理器;transaction对应不同事务。此方案即可看到事务的管理。
第四步,编写可执行程序。
EntityManager em0 = null; //调用自己的方法生成
EntityManager em1 = null; //调用自己的方法生成try {//选用任意一个EntityManager的事务即可em0.getTransaction().begin();//不同事务操作em0.merge(entity0);em1.merge(entity1);//选用原有EntityManager提交em0.getTransaction().commit();
} catch (Exception e) {e.printStackTrace();try {//正确状态进行事务回滚if (em0.getTransaction().isActive() && em0.getTransaction().getRollbackOnly()) {em0.getTransaction().rollback();}} catch (Exception ex) {ex.printStackTrace();}
} finally {if (em0 != null) {em0.close();em0 = null;}if (em1 != null) {em1.close();em1 = null;}
}
在实际执行中,打开一个事务即可。
调用该方案之后,发现运行出现如下错误:
Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/XADataSourceAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine suitable jdbc url
经过多次试验以后,发现该问题是由JTA库造成的。
解决方案如下:
在Springboot启动对应的yml或propeties库中加入如下的配置。(Properties文件需要换格式修改)
spring:# JTAjta:enabled: false
该方法可以让JTA不随Springboot启动,从而让该错误不发生。
使用者可以在自己的程序中,灵活使用JPA。
SpringBoot之JPA框架下如何使用JTA——分布式事务解决方案相关推荐
- SpringCloud分布式事务解决方案 整合 TX-LCN分布式事务框架
第一章 分布式事务介绍 一.什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 举个栗子: 电商系统中的订单系统与库存系统 ...
- Java JDBC事务与JTA分布式事务
Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于 ...
- 微服务架构下分布式事务解决方案——阿里GTS
1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...
- 微服务架构下分布式事务解决方案 —— 阿里GTS
1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...
- GTS来了!阿里微服务架构下的分布式事务解决方案
阿里妹导读:分布式事务已经成为微服务落地最大的阻碍,也是非常具有挑战性的一个技术难题. 为此,今天我们邀请阿里高级技术专家于皋,和大家深入探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿 ...
- 一行代码,保障分布式事务一致性—GTS:微服务架构下分布式事务解决方案
摘要: 虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题 ...
- 进阶必学之微服务架构下分布式事务解决方案,你不知道的58同城
1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...
- 深入解读微服务架构下分布式事务解决方案
微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.概念一经提出迅速火遍全球.当前 Hailo 有160个不同服务构成,NetFlix 有大约 ...
- jta分布式事务简单使用
个人理解总结: jta分布式事务,其实与普通的spring事务配置没多大区别,最主要的是配置不同的mapper使用不同的的数据源,然后再配atomikos和spring的jta事务管理器进行管理(sp ...
最新文章
- R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数
- DeepMind推出「控制套件」:为「强化学习智能体」提供性能基准
- 具体数学第二版第四章习题(1)
- python基础知识资料-Python学习--最完整的基础知识大全
- 哈夫曼树(最优二叉树)(c/c++)
- UA OPTI570 量子力学22 2-D Isotropic Q.H.O.简介
- 释疑のSmartforms点打印无反应
- 常用的云服务器,云数据库,高速缓存服务器
- Mongodb ruby driver API(中文)
- 经典知识:交互设计规范8大总结!附84页资料:《J 东交互设计规范》
- java查询比对是否重复_java-对象的ArrayList,比较对象并查找重复项,...
- 1152Google Recruitment
- 用concat批量生成MySQL查询语句
- 2010年11月8日,早会资料(日本的文化节)。CSDN博客系统出现问题了,这篇我就不改了,留着,在写一个。
- Python网络编程基础【底层网络】
- 一篇文章搞定:扫码登录实现原理
- RK3288 开机时间和开机速度优化安卓系统优化
- protobuf android 编译,Android 中protobuf 的安装,编译和使用
- 批量发短信的平台浏览总结
- 极简番茄钟与白噪音|潮汐