如何使用.net TransactionScope从MQ执行事务GET?

我有一个.NET TransactionScope需要包含MSSQL数据库和IBM MQ队列。

我在完全托pipe模式下使用.NET 4.0(VS2010),SQL 2008R2,MQ Server 6.0,MQ Client 7.0.1.9。 所有组件都在不同的机器上运行。

从我发现以下模式应该工作: http : //publib.boulder.ibm.com/infocenter/wmqv7/v7r1/index.jsp?topic=%2Fcom.ibm.mq.doc%2Fun11400_.htm

隐式事务以下代码片段描述了WebSphere MQ .NET应用程序如何使用.NET隐式事务编程来放置消息。

使用(TransactionScope范围=新的TransactionScope()){Q.Put(putMsg,pmo); scope.Complete(); }

Q.close(); qMgr.Disconect();}

在我的代码中,这看起来像:

// mq properties properties = new Hashtable(); properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); properties.Add(MQC.HOST_NAME_PROPERTY, HOSTNAME); properties.Add(MQC.PORT_PROPERTY, PORTNUMBER); properties.Add(MQC.CHANNEL_PROPERTY, CHANNELNAME); _queueManager = new MQQueueManager(queueManagerName, properties); _queue = _queueManager.AccessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING); _gmo = new MQGetMessageOptions(); _gmo.Options |= MQC.MQGMO_WAIT; _gmo.Options |= MQC.MQGMO_SYNCPOINT; _gmo.WaitInterval = 1000; // 1 seconds wait // in a loop using (TransactionScope t = new TransactionScope()) { var message = new MQMessage(); try { _queue.Get(message, _gmo); } catch (MQException mqe) { message = null; if (mqe.ReasonCode == 2033) { Console.WriteLine("No message available"); } else { throw; } } t.Complete(); } //Afterwards: if (_queue != null) { _queue.Close(); _queue = null; } if (_queueManager != null) { _queueManager.Disconnect(); _queueManager.Close(); _queueManager = null; } 

问题在于所有消息在应用程序closures后重新出现在队列中,而SQL数据库中的工作则被提交。 如果exception发生在transactionscope内部,那么SQL事务回滚,而MQ中的消息似乎保持被删除(直到我重新启动应用程序)。 另外,我没有看到.NET客户端和MQ服务器之间的任何DTC活动(这是预期的吗?)

我有一种迷失在这里,任何帮助,不胜感激。

  • 我应该使用哪个MQ客户端? 托pipe,非托pipe,XA?
  • 我应该看DTC活动吗? 我将如何让托pipe客户参与?
  • 应该在transactionscope中创build哪些对象?
  • 当应用程序结束时,为什么消息会重新出现在队列中?

UPDATE

  • 我已经在客户端和服务器上使用7.1,但是为了让我们的生产环境部署(服务器)版本需要很长时间。
  • 所以我需要在服务器端使用7.0.x版本,客户端可以使用我需要的任何东西。
  • 使用7.1客户端连接到MQ6服务器失败,错误代码为2354

那么,至少需要安装WebSphere MQ V7.1(客户端和队列管理器)以使用TransactionScope以完全托管模式运行全局事务。 在这种情况下,MS DTC将成为交易协调员。 您发布的信息中心链接实际上是指向WebSphere MQ v7.1。

更新:
在MQ v7.1之前,仅在MTS作为事务协调器的非托管模式下支持XA事务。 非托管模式下分布式事务的示例代码在这里 。 您将需要额外的组件,扩展交易客户端(XTC)进行安装。 根据最新的公告XTC是免费的。 可安装的可以在您的MQ服务器安装映像中找到。

当MQ连接断开(基本上调用MQDISC)时,事务中的任何未提交的消息将被回滚。 由于这个消息重新出现在队列中。