IBM XMS:CommittableTransaction() 与会话事务,它们是全局的吗?

IBM XMS: CommittableTransaction() vs session transaction, is any of them global?

我正在使用事务来读取和确认 IBM 队列上的消息,我想知道使用 connection.CreateSession(true, AcknowledgeMode.SessionTransacted) 创建的会话是否会 全局 锁定消息 [= =23=]多个实例 的消费者正在从同一个 队列中读取?

背景: 我编写了一个小型 .NET Core 后台服务,它使用 IBM XMS 获取队列的消息。该服务的实例将托管在两个不同的服务器上(负载平衡),每个服务将连接到同一个队列。我担心的是,由于不同服务器上的两个不同消费者正在从同一个队列读取,他们可能会尝试使用相同的消息。

我最近遇到了 SimpleXAConsumer 示例,其中使用了 CommittableTransaction() 对象而不是会话事务。 documentation 指出:

"When XA transaction is in use, the transaction control is through Distributed Transaction Coordinator (DTC) global transactions and it is not though XMS sessions."

...这让我相信 XMS 会话事务不是全局的,除非使用 CommittableTransaction() 对象。

如果有人能确认一下就好了:

  1. 如果必须使用 CommittableTransaction() 来创建全局事务。
  2. 如果全局事务锁定一条消息,以便其他消费者无法使用它。

如果应用程序在事务处理会话中获取消息,则该消息将对其他应用程序不可见(因此无法获取)。如果应用程序使用 session.commit() 方法提交事务,则消息将从队列中永久删除。另一方面,如果消息被应用程序回滚,则该消息对其他消费者(或同一消费者)可用。

还有一点需要注意:如果第一个参数为 true,则 connection.createSession() 方法中的 AcknowledgeMode 参数无效 - 意味着正在创建事务会话。使用事务处理会话时,应用程序必须使用提交或回滚方法。