客户端应用程序启动的所有事务都由代理来跟踪。这些事务可以是简单 Message Queue 事务,也可以是分布式事务(XA 资源)管理器管理的分布式事务。
每个事务都有一个 Message Queue 事务 ID:这是一个 64 位数字,用于唯一标识代理上的事务。分布式事务也有一个分布式事务 ID (XID),长度可达 128 字节,由分布式事务管理器指定。Message Queue 负责维护 Message Queue 事务 ID 与 XID 之间的关联。
对于分布式事务而言,当失败时,事务可能停留在 PREPARED 状态,而不会提交。因此,作为管理员,您需要监视事务的状态,并回滚或提交那些停留在 PREPARED 状态的事务。
要列出代理跟踪的所有事务,请使用 list txn 命令。下面是 list txn 子命令的语法:
imqcmd list txn
例如,以下命令列出某个代理中的所有事务。
imqcmd list txn
对于每个事务,list 子命令将返回事务 ID、状态、用户名、消息数或确认数以及创建时间。例如:
--------------------------------------------------------------- Transaction ID State User name # Msgs/ Creation time # Acks --------------------------------------------------------------- 64248349708800 PREPARED guest 4/0 1/30/02 10:08:31 AM 64248371287808 PREPARED guest 0/4 1/30/02 10:09:55 AM |
该命令显示了代理中的所有事务,包括本地事务和分布式事务。只能提交或回滚处于 PREPARED 状态的事务。只有当您知道该事务由于失败而停留在 PREPARED 状态,而且分布式事务管理器当前没有提交该事务时才可以这样做。
例如,如果代理的 auto-rollback 属性设置为 false(请参见表 14–2),则必须在代理启动时手动提交或回滚处于 PREPARED 状态的事务。
list 子命令还分别显示事务中生成和确认的消息数 (#Msgs/#Acks)。提交事务之前不会传送这些消息,也不会处理确认。
query 子命令可以显示上述信息以及其他许多值:客户端 ID、连接标识和分布式事务 ID (XID)。下面是 query txn 子命令的语法:
imqcmd query txn -n transactionID
例如,以下示例生成如下所示的输出:
imqcmd query txn -n 64248349708800
Client ID Connection guest@192.18.116.219:62209->jms:62195 Creation time 1/30/02 10:08:31 AM Number of acknowledgments 0 Number of messages 4 State PREPARED Transaction ID 64248349708800 User name guest XID 6469706F6C7369646577696E6465723130313234313431313030373230 |
使用 commit 和 rollback 子命令可以提交和回滚分布式事务。正如前文所述,只能提交和回滚处于 PREPARED 状态的事务。
下面是 commit 子命令的语法:
imqcmd commit txn -n transactionID
例如:
imqcmd commit txn -n 64248349708800
imqcmd rollback txn -n transactionID
有关详细信息,请参见表 14–2 中的 imq.transaction.autorollback 属性。
也可以配置代理,使它在启动时自动回滚处于 PREPARED 状态的事务。