第 14 章 配置事务

14.1. 事务子系统配置

14.1.1. 配置事务管理者

您可以用基于 Web 的管理控制台,或命令行管理 CLI 配置事务管理者(transaction manager)。

用管理控制台配置事务管理者

下面的步骤解释了如何用基于 Web 的管理控制台配置事务管理者:

  1. 从屏幕的顶部选择 Configuration 标签页。
  2. 如果您在受管域里运行 JBoss EAP,请选择要修改的配置集。
  3. Subsystem 列表里,选择 Transactions 并点击 View
  4. 在相关的标签页里点 Edit 来对相关设置进行编辑。例如,在 Recovery 标签页中对恢复选项进行编辑。
  5. 进行修改后点击 Save 保存。
  6. 点击 Need Help? 显示帮助文本。
用管理 CLI 配置事务管理者

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

关于事务管理者配置选项的详细列表,请参考 JBoss EAP 事务管理者配置选项

14.1.2. 配置数据源来使用 JTA

这个任务向您展示如何在数据源上启用 Java Transaction API(JTA)。

先决条件
  • 您的数据库必须支持 JTA。如果不确定,请参考数据库的文档。
  • 创建一个 非 XA 数据源

    注意

    XA 数据源 在默认情况下已支持 JTA。

配置数据源使用 JTA
  1. 请用下列管理 CLI 命令将 jta 属性设置为 true

    /subsystem=datasources/data-source=DATASOURCE_NAME:write-attribute(name=jta,value=true)
    注意

    在受管域里,您必须在这个命令之前使用 /host=PROFILE_NAME

  2. 重新载入服务器来使所做的修改生效。

    重新载入

您的数据源现在可以使用 JTA 了。

14.1.3. 关于事务日志消息

您可以为事务 Logger 设置 DEBUG 日志级别,使日志文件保持可读来跟踪事务状态。如果需要进行更具体的故障排除,则使用 TRACE 日志级别。关于配置事务 Logger 的信息,请参考配置事务子系统的日志

当配置为 TRACE 日志级别时,事务管理者(TM)可以生成大量的日志信息。下面是一些常见的信息。这个列表并不完整,所以您也可能会遇到其他的信息。

表 14.1. 事务状态的改变

Transaction Begin(事务开始)

当事务开始时,com.arjuna.ats.arjuna.coordinator.BasicAction 类的 Begin 方法将被执行,在日志里会出现 BasicAction::Begin() for action-id <transaction uid> 信息。

Transaction Commit(事务提交)

当事务被提交时,com.arjuna.ats.arjuna.coordinator.BasicAction 类的 Commit 方法将被执行,在日志里会出现 BasicAction::Commit() for action-id <transaction uid> 信息。

Transaction Rollback(事务回滚)

当事务回滚时,com.arjuna.ats.arjuna.coordinator.BasicAction 类的 Rollback 方法将被执行,在日志里会出现 BasicAction::Rollback() for action-id <transaction uid> 信息。

Transaction Timeout(事务超时)

当事务超时时,com.arjuna.ats.arjuna.coordinator.TransactionReaper 类的 doCancellations 方法将被执行,在日志里会出现 Reaper Worker <thread id> attempting to cancel <transaction uid> 信息。然后您会看到相同线程的事务回滚信息(如前所述)。

14.1.4. 配置事务子系统的日志

您可以控制关于事务的日志信息量,这取决于 JBoss EAP 里的其他日志设置。您可以用管理控制台或 CLI 来配置日志设置。

用管理控制台配置事务 Logger
  1. 进入 Logging 子系统配置。

    1. 在管理控制台里,点击 Configuration 标签页。如果您使用了受管域,则需要首先选择适当的服务器配置集。
    2. 选择 Logging 子系统并点击 View
  2. 编辑 com.arjuna 属性。

    选择 Log Categories 标签页。com.arjuna 条目已经存在。选择 com.arjuna 并点击 Attributes 部分的 Edit。您可以修改日志级别并选择是否使用父处理程序。

    • 日志级别:

      一个事务可能会产生大量日志输出,默认的日志级别被设置为 WARN,从而使服务器的日志不会被事务日志大量占用。如果需要查看事务处理的详情,请使用 TRACE 日志级别,这会显示事务 ID。

    • 使用父处理程序:

      父处理程序指示 Logger 是否应该发送输出到其父 Logger。其默认设置是 true

  3. 点击 Save 保存修改。
用管理 CLI 配置事务 Logger

在管理 CLI 里使用下列命令来设置日志级别。对于独立服务器,请从命令里删除 /profile=default

/profile=default/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=VALUE)

14.2. 事务管理

14.2.1. 浏览和管理事务

管理 CLI 具有浏览和操纵事务记录的功能。这个功能是通过 TM 和 JBoss EAP 的管理 API 进行交互来实现的。

TM 会把每个待定事务及事务的参与者信息存储到一个持久性存储里,这个持久性存储被称为“对象库(object store)”。管理 API 将对象库作为 log-store 资源开放。名为 probe 的 API 操作读取事务日志并为每条记录创建一个节点路径。每当需要刷新 log-store 时,可以手动调用 probe 命令。事务日志快速地显示和消失是正常的。

刷新日志库

这个命令刷新受管域里使用 default 配置集的服务器组的日志库。对于独立服务器,请从命令里删除 profile=default

/profile=default/subsystem=transactions/log-store=log-store/:probe
查看所有预备的事务

要查看所有预备的事务,首先刷新日志库(请参考刷新日志库),然后运行下列命令(和文件系统的 ls 命令类似)。

ls /profile=default/subsystem=transactions/log-store=log-store/transactions

或者

/host=master/server=server-one/subsystem=transactions/log-store=log-store:read-children-names(child-type=transactions)

显示每个事务,包括其唯一标识符。可以为单独的事务运行单独的操作(请参考管理事务)。

14.2.1.1. 管理事务

查看事务的属性

要查看事务的信息,如 JNDI 名称、EIS 产品名和版本或者状态,请使用 :read-resource 管理 CLI 命令。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource
查看事务的参与者

每条事务日志都包含一个名为 participants 的子元素。在此元素上使用 read-resource 管理CLI 命令来查看事务的参与者。参与者是通过它们的 JNDI 名称标识的。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource

结果类似于:

{
   "outcome" => "success",
   "result" => {
       "eis-product-name" => "ActiveMQ",
       "eis-product-version" => "2.0",
       "jndi-name" => "java:/JmsXA",
       "status" => "HEURISTIC",
       "type" => "/StateManager/AbstractRecord/XAResourceRecord"
   }
}

这里显示的结果状态是 HEURISTIC,可以进行恢复。详情请参考恢复事务

特殊情况下可以在对象库里创建孤立记录,这是在日志里没有任何对应事务的 XAResourceRecords。例如,XA 资源已预备但在 TM 记录前崩溃,域管理 API 无法进行访问。要访问这样的记录,您需要将管理选项 expose-all-logs 设置为 true。这个选项没有保存在管理模型里,当服务器重启时会恢复至 false

/profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)

您也可以使用以下命令,它会以组合的形式显示事务参与者 ID。

/host=master/server=server-one/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-children-names(child-type=participants)
删除事务

每个事务日志都支持 :delete 操作来删除事务日志。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete
恢复事务

每个事务参与者都支持通过 :recover 管理 CLI 命令进行恢复。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover
  • 如果事务的状态是 HEURISTIC,恢复操作修改状态为 PREPARE 并触发恢复操作。
  • 如果其中一个事务参与者的状态为 heuristic,恢复操作会试图重新执行 commit 操作。如果成功,参与者将从事务日志里删除。您可以通过,在 log-store 上重新运行 :probe 操作并检查参与者已不再被列出,来验证这一点。如果这是最后一个参与者,事务也将被删除。
刷新需要恢复事务的状态

如果事务需要恢复,在进行实际恢复前,可以使用 :refresh 管理 CLI 命令来确定它当前仍需要恢复。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refresh

14.2.2. 查看事务统计信息

如果启用了事务管理者统计,您可以通过事务管理者查看已处理事务的统计信息。关于如何启用事务管理者统计的信息,请参考配置事务管理者

您可以用管理控制台或管理 CLI 来查看统计信息。在管理控制台里,从 Runtime 标签页的 Transactions 子系统里可以看到事务统计信息。但管理控制台里并没有所有的统计信息。

下表展示了每个可用的统计及其描述。

表 14.2. 事务子系统统计信息

统计信息描述

number-of-transactions

这个服务器上事务管理者处理的事务总数。

number-of-committed-transactions

这个服务器上事务管理者提交的事务数量。

number-of-aborted-transactions

这个服务器上事务管理者中止的事务数量。

number-of-timed-out-transactions

这个服务器上事务管理者处理的超时事务数量。这个数量也计入被中止的事务数量。

number-of-heuristics

处于 heuristic 状态的事务的数量。

number-of-inflight-transactions

已开始但还未终止的事务的数量。

number-of-application-rollbacks

失败源自应用程序的失败事务的数量。

number-of-resource-rollbacks

失败源自资源的失败事务的数量。

14.2.3. 事务对象库

事务需要一个地方来存储对象。其中一个选择是 JDBC 数据源。与文件库相比,JDBC 接口可以从相同网络上的任何系统上访问数据库。如果您使用文件库,在访问数据库之前磁盘必须共享或迁移。如果考虑到性能,JDBC 对象库可能比文件系统或 ActiveMQ 日志对象库要慢。

重要

如果您配置 transactions 子系统将 Apache ActiveMQ Artemis 日志用作事务日志的存储类型,那么就不允许两个 JBoss EAP 实例使用相同的目录来存储日志。应用服务器实例不能共享相同的位置,每个实例都需要配置唯一的位置。

将 JDBC 数据源用作事务对象库

按照下列步骤将 JDBC 数据源用作事务对象库。

  1. 创建数据源(例如,TransDS)。相关信息请参阅创建非 XA 数据源。请注意,数据源的 JDBC 驱动必须作为一个核心模块被安装,而不是作为一个 JAR 部署,只有这样才可以确保对象存储可以正常工作。
  2. 将数据源的 jta 属性设置为 false

    /subsystem=datasources/data-source=TransDS:write-attribute(name=jta, value=false)
  3. jdbc-store-datasource 属性设置为数据源要使用的 JNDI 名称,如 java:jboss/datasources/TransDS

    /subsystem=transactions:write-attribute(name=jdbc-store-datasource, value=java:jboss/datasources/TransDS)
  4. use-jdbc-store 属性设置为 true

    /subsystem=transactions:write-attribute(name=use-jdbc-store, value=true)
  5. 重新载入 JBoss EAP 服务器来使所做的修改生效。

    重新载入

下表列出所有和 JDBC 对象存储相关的可用属性。

表 14.3. 事务 JDBC 库属性

属性描述

use-jdbc-store

把它设置为 true 在事务里启用 JDBC 库。

jdbc-store-datasource

用于存储的 JDBC 数据源的 JNDI 名称。

jdbc-action-store-drop-table

是否在启动时删除或重新创建操作库。默认值是 false

jdbc-action-store-table-prefix

Aaction store 表名称的前缀。

jdbc-communication-store-drop-table

启动时是否删除并重新创建 Communication store 表。默认为 false

jdbc-communication-store-table-prefix

Communication store 表名称的前缀。

jdbc-state-store-drop-table

启动时是否删除并重新创建 State store 表。默认为 false

jdbc-state-store-table-prefix

State store 表名称的前缀。