跳到主要内容

使用XA事务

本节主要面向打算自行构建XA解决方案而非使用可用的Solace JEE连接器架构(JCA)资源适配器的应用程序架构师以及中级到高级程序员。此外,本节也适用于希望了解XA事务所使用的底层接口和构造的应用程序架构师和程序员。

Solace JMS实现版本7.1及以上支持Java事务API(JTA)和javax.transaction.xa.XAResource接口。XAResource接口提供了遵循X/Open CAE规范的XA接口的Java映射。

通过支持XAResource接口,客户端可以使用Solace JMS实现创建一个XA会话,在该会话中可以创建事务分支(在本节中也简称为事务),以发布和/或接收一系列保证消息。

在XA会话中的事务分支内发布和/或接收的消息被包含为单一原子单元。这种行为类似于本地事务会话(参见使用事务会话),然而,XA事务分支的不同之处在于,它可能是更大规模的分布式事务(也称为全局事务)的一部分,该事务涉及一组两个或更多来自独立网络Java资源的相关事务分支,这些分支以协调的方式进行管理。在分布式事务中,那些网络资源彼此之间没有知识或通信手段。

事务管理器是一个通常与Java平台企业版(Java EE)应用服务器相关联的软件实体,它使用为每个将参与分布式事务的XA会话获得的XAResource对象。通过这些XAResource对象,事务管理器可以管理分布式事务中涉及的事务分支。(XAResource依赖于唯一标识每个XA事务及其相关全局事务的Xids。)

事务管理器可以以协调的方式指示每个XAResource为其各自的事务分支执行特定操作,这些操作符合用于分布式事务的两阶段提交过程。

  • 在第一阶段,事务管理器指示分布式事务中的每个资源为其事务做好提交准备。
  • 在第二阶段,事务管理器随后指示每个资源执行以下操作之一:
    • 提交各自的事务分支。在这种情况下,所有事务所执行的工作都将被提交,并且整个事务将被原子性地提交。
    • 如果一个或多个资源报告它们无法为其事务分支做好提交准备,则回滚事务。在这种情况下,事务中执行的任何工作都不会被提交。

Solace不提供事务管理器。然而,为了使管理员能够将Solace PubSub+与Java EE应用服务器环境集成,Solace JCA 1.5资源适配器可用于某些应用服务器环境。如需更多信息,请联系Solace。

线程考虑

作为XA的Java映射,JTA在处理线程方面与XA规范有所不同。XA有一个“控制线程”的概念,它规定一个给定的事务只能被一个线程访问,或者如果要将事务迁移到另一个线程,则必须对事务执行特殊操作。相反,JTA创建了一个XAResource对象,该对象承担了XA控制线程的角色。因此,在JTA中,事务不是绑定到处理线程,而是绑定到XAResource,并且XAResource必须在必要时提供线程安全性。通过使用XAResource,JTA不存在XA的线程迁移问题。

JTA所做的另一个简化是,它不支持XA规范中描述的异步操作——XA可能有一个选项可以异步完成一个操作,但在JTA中,操作总是阻塞的。由于当前Java应用中使用了多线程,JTA不支持异步操作并不是一个很大的限制。