【发布时间】: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