一、概述
在日常我的项目中必定须要用到数据源,那么数据源是什么,当遇到分布式事务的场景时数据源与非分布式事务场景的数据源又有什么不同呢,在 J2EE 中分布式事务又是如何实现的呢,心愿本文能够解答您的纳闷。
二、数据源
2.1 数据源是什么
艰深来讲,数据源是存储数据的中央。例如,数据库是数据源,其余零碎也能够是数据源。在 J2EE 里,数据源是代表物理数据存储系统的理论 Java 对象。通过这些对象,J2EE 利用能够获取到数据库的 JDBC 连贯。
2.2 数据源的设计
从 UML 图上能够看出,CommonDaraSource是对数据源概念的顶层形象,束缚了数据源必须实现的办法。数据源有三种类型的实现,别离是:
- DataSource,根本实现,用于生成规范 Connection 对象
- ConnectionPoolDataSource,连接池实现,这个数据源并不会间接创立数据库物理连贯,而是一个逻辑实现,它的作用在于池化数据库物理连贯。因为数据库物理连贯是一个重量级的对象,频繁的创立销毁很影响性能,将物理连接池化后可升高创立和销毁的频率,复用连贯以充分利用连贯资源。
- XAConnection,分布式事务实现,为反对分布式事务而诞生,这个数据源间接生产出的不是数据库物理连贯 Connection, 而是一个反对 XA 的 XAConnection 对象,XAConnection 对象能够间接生产数据库物理连贯,同时生产 XAResource 用于反对 XA 事务,通常 XAConnection 对象生产出的数据库物理连贯 Connection 须要和该 XAConnection 生产出的 XAResource 对象配合应用以实现 XA 事务处理。并且 XAConnection 继承 PooledConnection,那就也具备连接池的实现。
三、为什么须要 XA 数据源
3.1 XA 数据源是什么
XA 数据源指的是反对 XA 标准的数据源,反对分布式事务。
3.2 XA 标准是什么
XA 标准是一种分布式事务解决方案。X/OPEN 组织定义的分布式事务处理模型(DTP),其蕴含 3 种角色和两个协定:
- AP(Application,应用程序)
- RM(Resources manager,资源管理器),通常指数据库
- TM(Transaction manager,事务管理器),通常指事务协调者,负责协调和治理事务,提供给 AP 接口以及治理资源
- XA 协定是事务管理器与资源管理器之间的通信接口
- TX 协定是应用程序与事务管理器之间的通信接口
该模型中应用程序将一个全局事务传送到事务管理器,事务管理器将每个全局事务合成为多个分支(分支事务),并将分支事务调配给独自的资源管理器进行服务,事务管理器通过 XA 接口将每个分支事务与适当的资源管理器进行协调。
3.3 分布式事务具备有什么样的作用?
如果仅在同一个事务上下文中须要协调多种资源(即数据库以及音讯主题或队列等等),这个事务中的所有操作都必须胜利,否则所有操作都将在失败的状况下回滚。这就是 XA 数据源的作用。
3.4 那什么样的场景须要应用 XA?
- 您的 JavaEE 应用程序必须应用单个事务将数据存储在两个数据库中
- 您的应用程序须要通过单个事务发送 JMS 音讯并将信息存储在数据库中
- 您心愿应用 PVP 将您本人我的项目的域信息存储在一个不同的数据库中,而这个数据库是被 jBPM 用来存储它本人的数据。
四、那怎么应用分布式事务呢?
4.1 J2EE 的分布式事务
Java 事务编程接口(Java Transaction API,JTA)和 Java 事务服务(Java Transaction Service,JTS)为 J2EE 平台提供了分布式事务服务。
JTA 事务是 XA 标准的 Java 实现,JTA 事务无效的屏蔽了底层事务资源,使利用能够以通明的形式参加到事务处理中。分布式事务包含事务管理器和一个或多个反对 XA 协定的资源管理器。
JTA 是面向利用或应用服务器与资源管理器的高层事务接口。
JTS 是一组约定 JTA 中角色之间交互细节的标准。
JTA 提供了以下四个接口
- javax.transaction.UserTransaction,是面向开发人员的接口, 可能编程地管制事务处理。UserTransaction.begin 办法开启一个全局事务,并且将该事务与调用线程关联起来。
- javax.transaction.TransactionManager,容许应用程序服务器来管制代表正在治理的应用程序的事务。它自身并不承当理论的事务处理性能,它更多的是充当 UserTransaction 接口和 Transaction 接口之间的桥梁。
- javax.transaction.Transaction,代表了一个物理意义上的事务,在开发人员调用 UserTransaction.begin()办法时 TransactionManager 会创立一个 Transaction 事务对象,
- javax.transaction.xa.XAResource,面向提供商的实现接口,是一个基于 X /Open CAE Specification 的行业标准 XA 接口的 Java 映射。提供商在提供拜访本人资源的驱动时,必须实现这样的接口。
开发者调用 UserTransaction.begin 办法时,因为 UserTransaction 的实现类持有 TransactionManager,TransactionManager 充当 UserTransaction 和 Transaction 之间的桥梁,所以在调用 UserTransaction 的 begin 办法时,TransactionManager 会创立 Transaction 事务对象,并把此对象通过 ThreadLocal 关联到以后线程。当调用 UserTransaction 其余办法时,会从以后线程取出事务对象 Transaction 对象,并通过 Transaction 对象找到与其关联的 XAResource 对象,而后进行 commit、rollback 等操作。其根本流程如以下代码:
// 创立一个 Transaction,挂到以后线程上
UserTransaction userTx = null;
Connection connA = null;
Connection connB = null;
try{userTx.begin();
// 将 Connection 对应的 XAResource 挂到以后线程对应的 Transaction
connA.exec("xxx")
connB.exec("xxx")
// 找到 Transaction 关联的 XAResource,让它们都提交
userTx.commit();}catch(){
// 找到 Transaction 关联的 XAResource,让它们都回滚
userTx.rollback();}
4.2 如何应用 J2EE 的分布式事务
- WebLogic、Websphere、JBoss 等支流的应用服务器提供了 JTA 的实现和反对。
- Tomcat 中没有提供 JTA 的实现的,这就须要借助第三方的框架 Jotm、Automikos 等来实现。
五、总结
本文次要介绍了数据源和 XA 数据源,以及分布式事务基本原理、作用和场景以及如何应用 J2EE 分布式事务,但这种是属于基于资源层的底层分布式事务解决方案,在业内,用来解决分布式事务的计划还有柔性事务,柔性事务包含几种类型:两阶段型、弥补型、异步确保型和最大致力告诉型,有趣味能够更深刻的理解一下。
六、参考
- https://dzone.com/articles/da…
- https://searchoracle.techtarg…
- https://docs.oracle.com/datab…
- https://docs.oracle.com/javas…
- https://blog.csdn.net/conquer…
- https://www.ibm.com/developer…
- https://www.dazhuanlan.com/20…
作者 | Karina Varela · Jun
翻译 | 小青菜
起源 | https://dzone.com/articles/da…
本文有 spring4all 技术翻译组实现,更多国外前沿常识和干货好文,欢送关注公众号:后端面试那些事儿。