我正在使用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>
任何人都可以向我解释这个吗?
答案 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