【问题标题】:MQ Manager Connection not participating in transaction scopeMQ 管理器连接不参与事务范围
【发布时间】:2017-11-05 13:47:24
【问题描述】:

我正在使用 MQClient 7.5.0.5,以及用于 .net 应用程序的 MQ API。

如果我使用不在事务范围内的 WMQ.MQQueueManager 打开 MQManager 连接, 该连接不会参与我稍后打开的任何事务。 但是,如果连接是在事务范围内完成的,则该连接稍后将参与任何其他事务范围(与打开连接的第一个事务范围无关)。 进一步解释:

我有一个 DoWork 方法:

void DoWork(MQManager mqManager)
{
   //Write to DB
    ......
   queue = mqManager.AccessQueue(queueName, MQOO_OUTPUT)

   MQPutMessageOptions op = new MQPutMessageOptions();
   op.options = MQPMO_SYNCPOINT;
   queue.Put(msg, options);
   queue.Close();
}

当代码是这样的时候,连接不参与事务:

mqManager = new MQManager("MgName","ChName","Srv(port)");
using(scope = new transaction scope)
{
   DoWork(mqManager)
   scope.complete();
}
mqManager.dossconnect();

当代码是这样的时候,连接参与两个事务:

MQManager mqManager = null;
using(scope1 = new transaction scope)
{
     mqManager = new MQManager("MgName","ChName","Srv(port)");
     scope.complete()
}
using(scope = new transaction scope)
{
   DoWork(mqManager);
   scope.complete();
}
mqManager.dossconnect();

这是为什么呢? 我找不到有关此主题的文档。 我发现的只是 IBM 文档声称:“一个连接可能参与多个事务,但在任何时间点只有一个事务处于活动状态。” 但没有关于何时或如何打开连接的信息。 我希望它像一个 DB 连接,它只参与它打开的事务范围,但这里 MQmanager 连接参与任何事务,只有当它在一个事务范围内打开时才开始......

谁能给我解释一下?

【问题讨论】:

    标签: .net transactions websphere ibm-mq


    【解决方案1】:

    在这个领域有几个 APAR。APAR IT16143 介绍了 MQ 附带的 MQ.NET XA 示例的更改。另一个 APAR 是 IT16606。根据 XA 规范,一个连接只能参与一个 给定时间的活跃交易。错误 MQRC_GLOBAL_UOW_CONFLICT 如果连接的先前事务仍处于活动状态,则报告 当连接在另一个工作单元内使用时。为了 防止这个错误,应用程序的设计方式应该是 2 事务单元不共享相同的连接句柄 同时。以下链接更多地讨论了交易。 https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q029290_.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多