11.2. 事务概念


11.2.1. 关于交易

事务由两个或多个操作组成,它们都必须成功或全部失败。成功的结果是提交,失败的结果为回滚。在回滚中,每个成员的状态在尝试提交之前恢复为其状态。

设计良好的事务的典型标准是原子、一致、隔离和可达(ACID)。

11.2.2. 关于交易的 ACID 属性

ACID 是缩写词,代表 原子性一致性隔离 和持久性。此术语通常用于数据库或事务操作。

原子性
要使事务成为原子性,所有事务成员都必须做出相同的决定。他们要么全部提交,要么全部回滚。如果原子性中断,结果将被称为启发式的结果。
致性
一致性意味着写入数据库的数据保证为有效的数据,就数据库架构而言。数据库或其他数据源必须始终处于一致状态。不一致状态的一个示例是,在操作中止前写入一半数据。一致的状态是写入所有数据,或者写入操作在无法完成时回滚。
隔离
隔离意味着交易所执行的数据必须在修改之前锁定,以防止超出事务范围的进程修改数据。
持久性
持久性意味着,在交易成员收到指示提交后的外部故障时,所有成员都可以在解决故障时继续提交事务。此故障可能与硬件、软件、网络或其他任何相关系统相关。

11.2.3. 关于交易协调员或交易管理器

在使用 JBoss EAP 进行事务处理方面,交易量和事务管理器 ™ 大多可以互换。交易审核员这一术语通常用于分布式 JTS 交易。

在 Jakarta Transactions 事务中,TM 在 JBoss EAP 内运行,并在两阶段提交协议期间与交易参与者通信。

TM 告知事务参与者是提交还是回滚其数据,具体取决于其他交易参与者的结果。这样,它会确保事务遵循 ACID 标准。

11.2.4. 关于交易参与者

交易参与者是指交易中能够提交或回滚状态的任何资源。它通常是数据库或 Jakarta 消息传递代理,但通过实施交易界面,应用程序代码也可以充当交易参与者。交易的每个参与者均独立决定是否提交或回滚其状态,并且只有在所有参与者都能够提交整个交易成功时才可行。否则,每位参与者都会回滚其状态,整个交易都会失败。TM 协调提交或回滚操作,并确定事务的结果。

11.2.5. 关于 Jakarta Transactions

Jakarta Transactions 是 Jakarta EE Spec 的一部分。它在 Jakarta Transactions 1.3 规范 中定义。

Jakarta Transactions 的实施通过 TM 实施,TM 由 Narayana 项目针对 JBoss EAP 应用服务器进行介绍。TM 允许应用程序通过单一全球交易分配各种资源,如数据库或 Jakarta 消息传递代理。全局事务被称为 XA 事务。通常具有 XA 功能的资源包含在此类交易中,但非 XA 资源也可以成为全球交易的一部分。有几个优化可帮助非 XA 资源作为 XA 功能资源的行为。如需更多信息,请参阅单阶段提交LRCO 优化

在本文档中,术语 Jakarta Transactions 指的是两个方面:

  1. Jakarta Transactions,由 Jakarta EE 规范定义。
  2. 它指示 TM 如何处理事务。

TM 在 Jakarta Transactions 事务模式中工作,数据在内存中共享,事务上下文由远程 Jakarta Enterprise Beans 调用传输。在管理事务模式中,通过发送通用对象请求代理架构(CORBA)消息和 IIOP 调用传输事务上下文来共享数据。两种模式都支持在多个 JBoss EAP 服务器之间进行事务分发。

11.2.6. 关于 JTS

JTS 是对象交易服务(OTS)到 Jakarta 的映射。Jakarta EE 应用使用 Jakarta Transactions 来管理事务。然后,当交易经理切换到 JTS 模式时,Jakarta Transactions 与对象事务服务事务实施交互。JTS 工作于 IIOP 协议。使用 JTS 的事务管理器使用称为对象请求代理(ORB)的进程相互通信,使用称为通用对象请求代理架构(CORBA)的通信标准。如需更多信息,请参阅 JBoss EAP 配置 指南中的 ORB 配置

从应用角度使用 Jakarta Transactions 时,JTS 事务的行为方式与 Jakarta Transactions 交易相同。

注意

JBoss EAP 中包含的 JTS 实施支持分布式事务。完全合规 JTS 事务的区别在于与外部第三方 ORB 的互操作性。JBoss EAP 不支持此功能。支持的配置仅在多个 JBoss EAP 容器之间分发事务。

11.2.7. 关于 XML 事务服务

XML 交易服务(XTS)组件支持在业务交易中协调私有和公共 Web 服务。通过使用 XTS,您可以以受控且可靠的方式协调复杂业务交易。XTS API 支持基于 WS-Coordination、WS-Atomic Transaction 和 WS-Business Activity 协议的事务协调模型。

11.2.7.1. XTS 使用的协议概述

WS-协调(WS-C)规范定义了一个框架,它允许插入不同的协调协议以协调客户端、服务和参与者之间的工作。

WS-Transaction(WS-T)协议包括交易协调协议、WS-Atomic Transaction(WS-AT)和 WS-Business Activity(WS-BA)协议,它们利用 WS-C 提供的协调框架。WS-T 是为统一现有的传统交易处理系统而开发的,允许它们相互可靠的通信。

11.2.7.2. Web 服务-原子事务流程

原子事务(AT)旨在支持适合 ACID 语义的短持续时间交互。在 AT 范围内,Web 服务通常采用桥接来访问由 WS-T 控制的 XA 资源,如数据库和消息队列。当交易终止时,参与者将 AT 的结果决定传播到 XA 资源,每个参与者均采取适当的提交或回滚行动。

11.2.7.2.1. Atomic 事务过程
  1. 要启动 AT,客户端应用程序首先找到支持 WS-T 的 WS-C 激活器 Web 服务。
  2. 客户端向服务发送 WS-C CreateCoordinationContext 消息,并将 http://schemas.xmlsoap.org/ws/2004/10/wsat 指定为其协调类型。
  3. 客户端从激活服务接收适当的 WS-T 上下文。
  4. CreateCoordinationContext 消息的响应(事务上下文 )将其 reconcileType 元素设置为 WS-AT 命名空间 http://schemas.xmlsoap.org/ws/2004/10/wsat。它还提到了原子交易协调器端点,即 WS-C 注册服务,以供参与者参加。
  5. 客户端通常继续调用 Web 服务并完成事务,要么提交 Web 服务执行的所有更改,要么回滚。为了能够驱动这一完成,客户端必须通过向注册服务发送寄存器消息(在协调环境中返回端点),将自身注册为完成协议的参与者。
  6. 旦注册完成,客户端应用程序便会与 Web 服务交互,以完成其业务级别工作。每次调用业务 Web 服务时,客户端都会将事务上下文插入到 SOAP 标头块中,使得每次调用都会隐式地限制在交易范围内。支持 WS-AT 感知 Web 服务的工具包提供工具来连接 SOAP 标头块中的上下文与后端操作。这可确保通过 Web 服务进行的修改在与客户端相同的交易范围内进行,并接受交易协调员提交或回滚。
  7. 完成所有必要的应用程序工作后,客户端即可终止事务,以永久更改服务状态。完成参与者指示协调员尝试提交或回滚交易。提交或回滚操作完成后,会将状态返回给参与者以指明交易的结果。

详情请查看 Naryana 项目文档中 的 WS-Co ordination。

X ts 子系统可能会遇到与 Microsoft .NET 客户端通信的问题,因为 WS-AT 规范实施的 .NET 实施存在差异。WS-AT 规范的 .NET 实施强制任何调用异步。

若要实现与 .NET 客户端的互操作性,JBoss EAP xts 子系统中提供了异步注册选项。XTS 异步注册默认为禁用,您应仅在需要时启用它。

要启用与 .NET 客户端的 WS-AT 互操作性,请使用以下管理 CLI 命令:

/subsystem=xts:write-attribute(name=async-registration, value=true)
Copy to Clipboard Toggle word wrap

11.2.7.3. Web 服务-业务活动过程

Web 服务 - 业务活动(WS-BA)定义 Web 服务应用程序协议,使现有的业务处理和工作流系统能够包装其专有机制,跨实施和业务界限进行互操作。

WS-AT 协议模型不同,其中参与者仅在询问时告知其状态,WS-BA 中的子活动可以直接向协调者指定结果,而不必等待请求。参与者可以选择退出活动,或在任何时间点通知协调人员失败。此功能在任务失败时很有用,因为通知可用于修改目标并向前驱动处理,而不必等待事务结束时确定故障。

11.2.7.3.1. WS-BA 流程
  1. 请求服务来开展工作。
  2. 只要这些服务能够撤销任何工作,它们都会通知 WS-BA,以防 WS-BA 之后决定取消工作。如果 WS-BA 出现故障。它可以指示服务执行其 撤销 行为。

WS-BA 协议采用基于补偿的交易模式。当业务活动的参与者完成其工作时,可以选择退出活动。这种选择不允许任何后续回滚。或者,参与者也可以完成自己的活动,向协调者发出信号,如果稍后有一名参与者通知了失败,可以弥补他们已经完成的工作。在后者的情况下,协调会要求每个未退出的参与者弥补失败,让他们有机会执行他们认为适当的任何补偿措施。如果所有参与者在没有失败的情况下退出或完成,协调会通知每位已完成的参与者活动已经结束。

详情请查看 Naryana 项目文档中 的 WS-Co ordination。

11.2.7.4. 事务桥接概述

事务 Bridging 描述了链接 Jakarta EE 和 WS-T 域的过程。事务桥组件 txbridge 提供双向支持,使得任何类型的事务都可以包含设计用于其他类型的业务逻辑。网桥所使用的技术是交集和协议映射的组合。

在交易桥中,交集的协调员注册到现有交易中并执行协议映射的其他任务;即,它似乎是其本土交易类型的资源,而似乎其子方是其本机交易类型的协调者,即使这些交易类型有所不同。

事务网桥驻留在 org.jboss.jbossts.txbridge 及其子软件包中。它由两组不同的类组成,一个用于在各个方向上桥接。

如需了解更多详细信息,请参阅 Naryana 项目文档中的 TXBridge 指南

11.2.8. 关于 XA 资源和 XA 事务

XA 代表 eXtended 架构,由 X/Open Group 开发以定义使用多个后端数据存储的交易。XA 标准描述了全局 TM 和本地资源管理器之间的接口。XA 允许多个资源(如应用服务器、数据库、缓存和消息队列)参与同一事务,同时保留所有四个 ACID 属性。四个 ACID 属性中有一个是原子性,这意味着,如果其中一个参与者未能提交更改,其他参与者中止交易,并将其状态恢复为与交易发生前相同的状态。XA 资源是可参与 XA 全球交易的资源。

XA 事务是可跨越多个资源的事务。它涉及一个协调 TM,与一个或多个数据库或其他事务资源一起涉及单一全球 XA 事务。

11.2.9. 关于 XA 恢复

TM 实施 X/Open XA 规范并支持跨多个 XA 资源进行 XA 事务。

XA 恢复是确保更新或回滚受交易进程影响的所有资源的过程,即使任何资源属于交易参与者崩溃或不可用。在 JBoss EAP 范围内,事务 子系统为使用它们的任何 XA 资源或子系统(如 XA 数据源、Jakarta 消息传递消息队列和 Jakarta Connectors 资源适配器)提供了 XA 恢复机制。

XA 恢复发生,无需用户干预.如果 XA 恢复失败,日志输出中会记录错误。如果需要帮助,请联系红帽全球支持服务。XA 恢复过程由定期恢复线程驱动,该线程默认每两分钟启动一次。定期恢复线程处理所有未完成事务。

注意

完成一个 in-doubt 事务的恢复可能需要 4 到 8 分钟,因为它可能需要多次运行恢复过程。

11.2.10. XA 恢复过程的限制

XA 恢复有以下限制:

  • 可能无法从成功提交的事务中清除事务日志。

    如果 JBoss EAP 服务器在 XAResource 提交方法后崩溃并提交事务,但在协调员更新日志之前,您可能会在重启服务器时在日志中看到以下警告消息:

    ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord
    Copy to Clipboard Toggle word wrap

    这是因为在恢复时,JBoss 事务管理器(TM)会在日志中看到事务参与者并尝试重试提交。最终,JBoss TM 假设资源已提交,不再重试提交。在这种情况下,您可以在提交事务时安全地忽略此警告,而且不会丢失数据。

    要防止警告,请将 com.arjuna.ats.jta.xaAssumeRecoveryComplete 属性 值设置为 true。当新的 XAResource 实例无法来自任何注册的 XAResource Recovery 实例时,就会检查此属性。当设置为 true 时,恢复假设上一提交尝试成功,并且可以在不进一步恢复尝试的情况下从日志中移除实例。此属性必须谨慎使用,因为它是全局的,使用不正确时可能会导致 XAResource 实例处于未提交状态。

    注意

    JBoss EAP 7.4 实施了增强功能,以便在成功提交事务后清除事务日志,以上情况不应频繁发生。

  • 当服务器在 XAResource.prepare() 结束时崩溃时,不会在 JTS 事务中调用回滚。

    如果 JBoss EAP 服务器在完成 XAResource.prepare() 方法调用后崩溃,则所有参与的 XAResource 实例都会处于就绪状态,并在服务器重启后保持这种方式。事务不会被回滚,资源在事务超时或数据库管理员手动回滚资源并清除事务日志前保持锁定。如需更多信息,请参阅 https://issues.jboss.org/browse/JBTM-2124

  • 对已提交的事务可进行定期恢复。

    当服务器负载过量时,服务器日志可能包含以下警告信息,后跟一个 stacktrace:

    ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAException
    Copy to Clipboard Toggle word wrap

    在负载过重时,交易所花费的处理时间可能与定期恢复过程的活动时间重叠。定期恢复过程检测到仍在进行中的事务,并尝试启动回滚,但实际交易将继续完成。在定期恢复尝试但回滚失败时,它会在服务器日志中记录回滚失败。以后的发行版本中会解决此问题的根本原因,但目前可以使用一个临时解决方案。

    通过将 com.arjuna.ats.jta.orphanSafetyInterval 属性设置为大于默认值 10000 毫秒,以增大恢复过程的两个阶段之间的间隔。建议值为 40000 毫秒。请注意,这不会解决这个问题。相反,它会降低发生该信号的可能性,并在日志中显示警告消息。如需更多信息,请参阅 https://developer.jboss.org/thread/266729

11.2.11. 关于 2-Phase 提交协议

两阶段提交(2PC)协议引用一种算法来确定事务的结果。2PC 由事务管理器(TM)驱动,作为完成 XA 事务的过程。

第 1 阶段:准备

在第一阶段,交易参与者通知交易协调员是他们可以提交交易还是必须回滚。

第 2 阶段:提交

在第二阶段,交易协调员决定整个交易应提交或回滚。如果任一参与者无法提交,交易必须回滚。否则,事务可以提交。协调会指示有关要做什么的资源,他们在完成此操作时通知协调员。此时,事务已完成。

11.2.12. 关于交易超时

为了保持原子性并遵循用于事务的 ACID 标准,事务的某些部分可以长时间运行。事务参与者在提交时需要锁定作为队列中数据库表或消息一部分的 XA 资源。TM 需要等待每个交易参与者回听,然后才能指示他们全部提交或回滚。硬件或网络故障可能会导致资源被无限期锁定。

事务超时可以与事务关联,以控制其生命周期。如果在事务提交前通过超时阈值或回滚,超时会导致自动回滚事务。

您可以为整个事务子系统配置默认超时值,或者您可以禁用默认超时值并根据每个事务指定超时。

11.2.13. 关于分布式交易

分布式事务是指与多个 JBoss EAP 服务器上的参与者进行的一项交易。JTS 规范要求 JTS 事务能够分布到来自不同供应商的应用程序服务器中。Jakarta Transactions 没有定义,但 JBoss EAP 支持 JBoss EAP 服务器中的分布式 Jakarta Transactions 事务。

注意

不支持不同供应商的服务器之间的事务分配。

注意

在其他应用程序服务器供应商文档中,您可能会发现术语分布式事务意味着 XA 事务。在 JBoss EAP 文档环境中,分布式事务指的是在多个 JBoss EAP 应用服务器中分发的交易。包含不同资源(如数据库资源和 Jakarta 消息传递资源)的事务在本文档中被称为 XA 事务。如需更多信息,请参阅 关于 JTS 和关于 XA 数据源和 XA 事务

11.2.14. 关于 ORB 便携 API

对象请求代理(ORB)是一个向交易参与者、投资者、资源和其他跨多个应用服务器分发的其他服务发送和接收消息的过程。ORB 使用标准化接口描述语言(IDL)来通信和解释消息。通用对象请求代理架构(CORBA)是 JBoss EAP 中 ORB 使用的 IDL。

使用 ORB 的主要服务类型是分布式 Jakarta Transactions 系统,采用 JTS 规范。其他系统,特别是传统系统,可以选择使用 ORB 进行通信,而非其他机制,如远程 Jakarta Enterprise Beans 或 Jakarta 企业 Web 服务或 Jakarta RESTful Web 服务。

ORB 可移植性 API 提供了与 ORB 交互的机制。此 API 提供了获取对 ORB 引用的方法,以及将应用置于侦听来自 ORB 的传入连接的模式中。API 中的部分方法不受所有 ORB 支持。在这些情况下,会抛出异常。

API 由两个不同的类组成:

  • com.arjuna.orbportability.orb
  • com.arjuna.orbportability.oa

有关 ORB Portability API 中包含的方法和属性的详细信息,请参阅 红帽客户门户 上的 JBoss EAP Java 文档捆绑包。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat