第 21 章 事务子系统

21.1. 事务子系统的配置

21.1.2. 配置事务管理者

您可以使用基于 Web 的管理控制台或命令行管理 CLI 来配置事务管理者(Transaction Manager,TM)。对于每条命令或选项,我们都假设您在受管域里运行 JBoss EAP 6。如果您使用的是独立服务器或者您想使用 default 之外的配置集,您可能需要修改下面的步骤和命令。

命令示例注记

  • 在管理控制台里,第一次登录时会自动选择 default 配置集。如果您想改动到其他配置集,请选择其他配置集。
    类似地,请在 CLI 命令示例里替换 default 配置集。
  • 如果您使用的是独立服务器,则只存在一个配置集。请忽略选择配置集的说明。在 CLI 命令示例里,请删除 /profile=default 部分。

注意

为了使 TM 选项在管理控制台或管理 CLI 里可见,您必须启用 transactions。它默认是启用的,对于许多其他子系统的正常运行,它也是必需的,所以不太可能禁用它。
用管理控制台配置事务管理者

要使用基于 Web 的管理控制台配置 TM,请从管理控制台屏幕的顶部选择 Configuration 标签页。如果您使用受管域,您可以在左上角的 Profile 选择框里选择正确的配置集。展开 Container 菜单并选择 Transactions

事务管理者配置页面里显示了多数的选项。Recovery 选项默认是隐藏的。点击 Recovery 标签页来查看恢复选项。然后点击 Edit 按钮来编辑任何选项。修改会立即生效。
点击 Need Help? 标签显示在线帮助文本。
用管理 CLI 配置事务管理者

在管理 CLI 里,您可以使用一系列命令来配置事务管理者。对于使用 default 的受管域,这些命令都以 /profile=default/subsystem=transactions/ 开始,而对于独立服务器则使用 /subsystem=transactions

重要

HornetQ 不允许多个实例共享消息日志库。如果您配置了多个 HornetQ 实例,每个实例都必须有自己地消息日志库。

表 21.1. 事务管理者配置选项

选项 描述 CLI 命令
Enable Statistics
是否启用事务统计。这些统计可以在管理控制台的 Runtime 标签页里的 Subsystem Metrics 部分查看。
/profile=default/subsystem=transactions/:write-attribute(name=enable-statistics,value=true)
Default Timeout
默认的事务超时时间。默认值是 300 秒。您可以在程序里对每个事务覆盖这个值。
/profile=default/subsystem=transactions/:write-attribute(name=default-timeout,value=300)
Object Store Path
TM 对象库存储数据的相对或绝对文件系统路径。默认是相对于 object-store-relative-to 参数的路径。
/profile=default/subsystem=transactions/:write-attribute(name=object-store-path,value=tx-object-store)
Object Store Path Relative To
引用域模型里的全局路径配置。默认值是 JBoss EAP 6 的数据目录,即 jboss.server.data.dir 属性的值。对于受管域,默认是 EAP_HOME/domain/data/,而对于独立服务器是 EAP_HOME/standalone/data/。对象库的 object-store-path TM 属性是相对于这个路径的值。
/profile=default/subsystem=transactions/:write-attribute(name=object-store-relative-to,value=jboss.server.data.dir)
Socket Binding
当使用基于套接字的机制时,指定事务管理者进行恢复和生成事务标识符时使用的套接字绑定的名称。关于生成唯一标识符的更多信息,请参考 process-id-socket-max-ports。您可以在管理控制台的 Server 标签页上为每个服务器组指定套接字绑定。
/profile=default/subsystem=transactions/:write-attribute(name=socket-binding,value=txn-recovery-environment)
Recovery Listener
事务恢复进程是否应该侦听网络接口。默认值为 false
/profile=default/subsystem=transactions/:write-attribute(name=recovery-listener,value=false)
下面是高级选项,只能用管理 CLI 进行修改。根据默认配置进行修改时请小心行事。更多信息请联系红帽全球支持服务。

表 21.2. 高级 TM 配置选项

选项 描述 CLI 命令
jts
是否使用 Java Transaction Service (JTS) 事务。默认值为 false,表示只使用 JTA 事务。
/profile=default/subsystem=transactions/:write-attribute(name=jts,value=false)
node-identifier
事务管理者的节点标识符。这个选项在下列情况下是必需的:
  • JTS 和 JTS 间的通讯
  • 当两个事务管理者访问共享的资源管理者
  • 当两个事务管理者访问共享的对象库
对于每个事务管理者来说,node-identifier 都必须是唯一的,因为它要求在恢复期间强制数据的一致性。对于 JTA 来说 node-identifier 也必须是唯一的,因为多个节点可能和系统的资源管理者交互或分享事务对象库。
/profile=default/subsystem=transactions/:write-attribute(name=node-identifier,value=1)
process-id-socket-max-ports
事务管理者为每个事务日志创建唯一的标识符。为生成唯一标识符提供两个不同的机制:基于套接字和基于进程标识符。
对于基于套接字的标识符,套接字被打开,其端口号用过标识符。如果端口已在使用,将探测下一个端口,直到找到空闲的端口。process-id-socket-max-ports 代表 TM 在失败前将尝试的最多套接字数量。默认值是 10
/profile=default/subsystem=transactions/:write-attribute(name=process-id-socket-max-ports,value=10)
process-id-uuid
true 表示使用进程标识符来为每个事务创建唯一的标识符。否则将使用基于套接字的机制。默认值为 true。更多信息请参考 process-id-socket-max-ports
/profile=default/subsystem=transactions/:write-attribute(name=process-id-uuid,value=true)
use-hornetq-store
对于事务日志,使用 HornetQ 的日志存储机制而不是基于文件的存储。这默认是禁用的,但可能会提高 I/O 性能。我们不推荐对 JTS 事务使用独立的事务管理者。当修改这个选项时,服务器必须用 shutdown 重启以使修改生效。
/profile=default/subsystem=transactions/:write-attribute(name=use-hornetq-store,value=false)

21.1.3. 用 JTA 事务配置您的数据源

概述

本节展示了如何启用数据源上的 JTA。

前提条件

在开始安装前,你必须满足下列条件:

过程 21.1. 配置数据源以使用 JTA 事务

  1. 在文本编辑器里打开配置文件。

    根据您是否以受管域还是独立服务器运行 JBoss EAP 6,您的配置文件所处的位置不同。
    • 受管域

      受管域的默认配置文件对于 Red Hat 企业版来说,位于 EAP_HOME/domain/configuration/domain.xml,对于 Microsoft Windows 则位于 EAP_HOME\domain\configuration\domain.xml
    • 独立服务器

      独立服务器的默认配置文件对于 Red Hat 企业版 Linux 来说,位于 EAP_HOME/standalone/configuration/standalone.xml,对于 Microsoft Windows,位于 EAP_HOME\standalone\configuration\standalone.xml
  2. 定位对应数据源的 <datasource> 标签。

    数据源将 jndi-name 属性设置为您创建时指定的值。例如,ExampleDS 数据源应类似于:
    <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
  3. 设置 jta 属性为 true

    和之前的步骤一样,添加下列内容到 <datasource> 标记里:jta="true"
  4. 保存配置文件。

    保存配置文件并退出文本编辑器。
  5. 启动 JBoss EAP 6。

    重新启动 JBoss EAP 6 服务器。
结果:

JBoss EAP 6 已启动且配置您的数据源使用 JTA 事务。

21.1.4. 配置 XA 数据源

前提条件

为了添加 XA 数据源,你需要登录至管理控制台。详情请参考 第 3.4.2 节 “登录到管理控制台”

  1. 添加新的数据源。

    添加新的数据源到 JBoss EAP 6。请按照 第 6.3.1 节 “用管理界面创建一个 Non-XA 数据源” 里的步骤,但要点击顶部的 XA Datasource 标签。
  2. 配置其他属性。

    第 6.6.1 节 “数据源参数” 列出了所有的数据源参数。
结果

配置好的 XA 数据源可以使用了。

21.1.5. 关于事务日志消息

要跟踪事务状态同时也使日志文件可读,对事务 logger 请使用 DEBUG 日志级别。详细地调试信息则使用 TRACE 日志级别。关于配置事务 logger 的信息,请参考 第 21.1.6 节 “为事务子系统配置日志”
当配置为 TRACE 日志级别时,事务管理者可以生成大量的日志信息。下面是一些最常见的信息。这个列表并不完整,所以实际环境里您可能会看到其他信息。

表 21.3. 事务状态变化

事务开始
当事务开始时,下列代码将被执行:
com.arjuna.ats.arjuna.coordinator.BasicAction::Begin:1342
tsLogger.logger.trace("BasicAction::Begin() for action-id "+ get_uid());
事务提交
当事务提交时,下列代码将被执行:
com.arjuna.ats.arjuna.coordinator.BasicAction::End:1342
tsLogger.logger.trace("BasicAction::End() for action-id "+ get_uid());
事务回滚
当事务回滚时,下列代码将被执行:
com.arjuna.ats.arjuna.coordinator.BasicAction::Abort:1575
tsLogger.logger.trace("BasicAction::Abort() for action-id "+ get_uid());
事务超时
当事务超时时,下列代码将被执行:
com.arjuna.ats.arjuna.coordinator.TransactionReaper::doCancellations:349
tsLogger.logger.trace("Reaper Worker " + Thread.currentThread() + " attempting to cancel " + e._control.get_uid());
您将看到相同的线程回滚上面显示的事务。

21.1.6. 为事务子系统配置日志

概述

使用这个过程来控制事务日志信息的数量,它独立于 JBoss EAP 6 里的其他日志设置。主过程展示了如何在基于 Web 的管理控制台里实现这一点。随后给出了管理 CLI 命令。

过程 21.2. 用管理控制台配置事务 Logger

  1. 进入日志配置区域。

    在管理控制台里,点击 Configuration 标签页。如果您在使用受管域,请在右上角的 Profile 选择框里选择要配置的服务器配置集。
    展开 Core 菜单,选择 Logging
  2. 编辑 com.arjuna 属性。

    选择 Log Categories 标签页。选择 com.arjuna 并点击 Details 部分的 Edit 按钮。在这里您可以添加类专有的日志信息。com.arjuna 类是现有的。您可以修改日志级别以及是否使用父处理程序。
    日志级别
    默认的日志级别是 WARN。因为事务可以产生大量的日志输出,标准日志级别对于事务 logger 来说有稍许不同。通常比所选日志级别严重性较低的消息会被舍弃。

    事务日志级别,从最精简到最冗余。

    • TRACE
    • DEBUG
    • INFO
    • WARN
    • ERROR
    • FAILURE
    使用父处理程序
    Logger 是否应该将输出发送到父 Logger。默认行为是 true
  3. 修改会立即生效。