JTA 事务概念
我们知道,单个数据库的事务是本地的事务,多个数据库生成的事务称为分布式事务。
一个事务可能涉及多个独立的操作。这些操作可以对同一资源或不同资源执行。在这里将事务(如数据库)中的参与组件称为资源。
XA 规范和 JTA(Java Transaction API)
XA 是指 eXtended Architecture,它是分布式事务处理的规范。XA 的目标是在涉及异构组件的全局事务中提供原子性。XA 规范通过称为两阶段提交的协议提供完整性。两阶段提交是一种广泛使用的分布式算法,用于促进提交或回滚分布式事务的决策。
Java Transaction API (JTA) 是在 Java Community Process 下开发的 Java Enterprise Edition API。它使 Java 应用程序和应用程序服务器能够跨 XA 资源执行分布式事务。
JTA 围绕 XA 架构建模,利用两阶段提交。JTA 定义了事务管理器与分布式事务中的各个资源之间的接口。
Atomikos
JTA 在 Java 中提供了用于构建具有分布式事务的应用程序的接口。现在,JTA 只是一个规范,不提供任何实现。为了运行一个利用 JTA 的应用程序,我们需要 JTA 的实现。这样的实现称为事务管理器。
通常,应用程序服务器提供事务管理器的默认实现。例如,在 Enterprise Java Beans (EJB) 的情况下,EJB 容器无需应用程序开发人员的任何明确干预即可管理事务行为。但是,在许多情况下,这可能并不理想,我们可能需要独立于应用程序服务器直接控制事务。
Atomikos 是一个用于 Java 的轻量级事务管理器,它使使用分布式事务的应用程序成为独立的。从本质上讲,我们的应用程序不需要依赖像应用程序服务器这样的重量级组件来处理事务。
Atomikos 主要是使用 JTA 事务管理器构建的,因此,它使用两阶段提交协议实现 XA 架构。
Atomikos 是一个分布式事务管理器,它提供的功能比 JTA/XA 要求的功能更多。它有一个开源产品和更全面的商业产品:
- TransactionsEssentials:Atomikos 的开源产品,为使用数据库和消息队列的 Java 应用程序提供 JTA/XA 事务管理器。这主要用于测试和评估目的。
- ExtremeTransactions:Atomikos 的商业产品,它提供跨复合应用程序的分布式事务,包括除数据库和消息队列之外的 REST 服务。这对于构建执行 Extreme Transaction Processing (XTP) 的应用程序非常有用。
Atomikos 提供了两个版本的 DataSource。
第一个是 AtomikosDataSourceBean,它知道底层的 XADataSource:
1 | AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); |
可以使用任何常规的 JDBC 驱动程序类:AtomikosNonXADataSourceBean
1 | AtomikosNonXADataSourceBean dataSource = new AtomikosNonXADataSourceBean(); |
顾名思义,AtomikosNonXADataSource 不兼容 XA。因此,不能保证使用此类数据源执行的事务是原子的。那么我们为什么要使用它呢?我们可能有一些数据库不支持 XA 规范。Atomikos 并不禁止我们使用这样的数据源,如果事务中存在单个这样的数据源,它仍然会尝试提供原子性。此技术类似于 Last Resource Gambit,后者是两阶段提交过程的变体。