MQ Manager连接未参与事务范围

时间:2017-11-05 13:47:25

标签: .net transactions websphere ibm-mq

我正在使用MQClient 7.5.0.5,使用MQ API for .net application。

如果我使用不在事务范围内的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文档声称:"连接可能参与多个事务,但在任何时间点只有一个事务处于活动状态。" 但没有关于何时或如何打开连接。 我希望它就像一个数据库连接,它只参与它打开的事务范围,但是这里MQmanager连接参与任何事务,只有它在事务范围内打开才能开始.... / p>

任何人都可以向我解释这个吗?

1 个答案:

答案 0 :(得分: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