Red Hat Training
A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform
第 14 章 配置事务
14.1. 事务子系统配置
14.1.1. 配置事务管理者
您可以用基于 Web 的管理控制台,或命令行管理 CLI 配置事务管理者(transaction manager)。
用管理控制台配置事务管理者
下面的步骤解释了如何用基于 Web 的管理控制台配置事务管理者:
- 从屏幕的顶部选择 Configuration 标签页。
- 如果您在受管域里运行 JBoss EAP,请选择要修改的配置集。
- 从 Subsystem 列表里,选择 Transactions 并点击 View。
- 在相关的标签页里点 Edit 来对相关设置进行编辑。例如,在 Recovery 标签页中对恢复选项进行编辑。
- 进行修改后点击 Save 保存。
- 点击 Need Help? 显示帮助文本。
用管理 CLI 配置事务管理者
通过管理 CLI,您可以用一系列命令来配置事务管理者。对于独立服务器,这些命令以 /subsystem=transactions
开始,而对于受管域里的 default
配置集,则是 /profile=default/subsystem=transactions/
。
关于事务管理者配置选项的详细列表,请参考 JBoss EAP 事务管理者配置选项。
14.1.2. 配置数据源来使用 JTA
这个任务向您展示如何在数据源上启用 Java Transaction API(JTA)。
先决条件
配置数据源使用 JTA
请用下列管理 CLI 命令将
jta
属性设置为true
。/subsystem=datasources/data-source=DATASOURCE_NAME:write-attribute(name=jta,value=true)
注意在受管域里,您必须在这个命令之前使用
/host=PROFILE_NAME
。重新载入服务器来使所做的修改生效。
重新载入
您的数据源现在可以使用 JTA 了。
14.1.3. 关于事务日志消息
您可以为事务 Logger 设置 DEBUG
日志级别,使日志文件保持可读来跟踪事务状态。如果需要进行更具体的故障排除,则使用 TRACE
日志级别。关于配置事务 Logger 的信息,请参考配置事务子系统的日志。
当配置为 TRACE
日志级别时,事务管理者(TM)可以生成大量的日志信息。下面是一些常见的信息。这个列表并不完整,所以您也可能会遇到其他的信息。
表 14.1. 事务状态的改变
Transaction Begin(事务开始) |
当事务开始时, |
Transaction Commit(事务提交) |
当事务被提交时, |
Transaction Rollback(事务回滚) |
当事务回滚时, |
Transaction Timeout(事务超时) |
当事务超时时, |
14.1.4. 配置事务子系统的日志
您可以控制关于事务的日志信息量,这取决于 JBoss EAP 里的其他日志设置。您可以用管理控制台或 CLI 来配置日志设置。
用管理控制台配置事务 Logger
进入 Logging 子系统配置。
- 在管理控制台里,点击 Configuration 标签页。如果您使用了受管域,则需要首先选择适当的服务器配置集。
- 选择 Logging 子系统并点击 View。
编辑
com.arjuna
属性。选择 Log Categories 标签页。
com.arjuna
条目已经存在。选择com.arjuna
并点击 Attributes 部分的 Edit。您可以修改日志级别并选择是否使用父处理程序。日志级别:
一个事务可能会产生大量日志输出,默认的日志级别被设置为
WARN
,从而使服务器的日志不会被事务日志大量占用。如果需要查看事务处理的详情,请使用TRACE
日志级别,这会显示事务 ID。使用父处理程序:
父处理程序指示 Logger 是否应该发送输出到其父 Logger。其默认设置是
true
。
- 点击 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 数据源用作事务对象库。
-
创建数据源(例如,
TransDS
)。相关信息请参阅创建非 XA 数据源。请注意,数据源的 JDBC 驱动必须作为一个核心模块被安装,而不是作为一个 JAR 部署,只有这样才可以确保对象存储可以正常工作。 将数据源的
jta
属性设置为false
。/subsystem=datasources/data-source=TransDS:write-attribute(name=jta, value=false)
把
jdbc-store-datasource
属性设置为数据源要使用的 JNDI 名称,如java:jboss/datasources/TransDS
。/subsystem=transactions:write-attribute(name=jdbc-store-datasource, value=java:jboss/datasources/TransDS)
把
use-jdbc-store
属性设置为true
。/subsystem=transactions:write-attribute(name=use-jdbc-store, value=true)
重新载入 JBoss EAP 服务器来使所做的修改生效。
重新载入
下表列出所有和 JDBC 对象存储相关的可用属性。
表 14.3. 事务 JDBC 库属性
属性 | 描述 |
---|---|
use-jdbc-store |
把它设置为 |
jdbc-store-datasource |
用于存储的 JDBC 数据源的 JNDI 名称。 |
jdbc-action-store-drop-table |
是否在启动时删除或重新创建操作库。默认值是 |
jdbc-action-store-table-prefix |
Aaction store 表名称的前缀。 |
jdbc-communication-store-drop-table |
启动时是否删除并重新创建 Communication store 表。默认为 |
jdbc-communication-store-table-prefix |
Communication store 表名称的前缀。 |
jdbc-state-store-drop-table |
启动时是否删除并重新创建 State store 表。默认为 |
jdbc-state-store-table-prefix |
State store 表名称的前缀。 |