队列中的事务支持(MSMQ)

时间:2017-11-03 15:08:56

标签: transactions msmq distributed

我试图了解MSMQ上的事务消息传递概念以及wcf中的事务支持。

对于具有事务支持的队列,是否意味着以下一组操作将是自动的?

  1. 计算机1上的客户端A在其应用程序数据库中写入一行,该消息发送到队列。
  2. 创建/发送订单创建消息到队列(比如MSMQ)。
  3. 客户端B在计算机2上接收MSMQ消息。
  4. 客户B在自己的应用程序数据库中创建订单行?
  5. 如果我在分布式事务中执行上述所有步骤,是否意味着所有4个步骤都将失败或以原子方式成功?

    或者交易只适用于步骤1 - 2?

    同样,如果说上面涉及WCF而不是MSMQ,那么所有步骤都是原子的,即在交易中吗?

1 个答案:

答案 0 :(得分:1)

简答:1 + 2是交易,然后3 + 4是第二次交易。

3可以想象在与2相同的事务中的唯一方式是接收者与发送者处于相同的事务上下文中(即,相同的逻辑执行线程)。否则,由于尚未提交第一个事务,因此接收时消息将不可见。为了将事务上下文从发送者传播到接收者,必须存在从发送者到接收者的第二通信信道(即,远程调用),这将使消息队列冗余。但这并没有多大意义,因为接收甚至可能从队列中得到不同的消息......

事实上,事务性MQ的要点恰恰是在两个不同的事务中将发送者和接收者分离,这样发送者不会受到接收者的可用性和性能的影响,而是以隔离为代价。因此,MQ提供存储和转发原子性+持久性,而在同一事务上下文中没有两个不同的应用程序(1和4)。原子上你会得到1 + 2,最后是3 + 4原子。

使用WCF,通过使用WS-AtomicTransactions而不是MQ,可以在同一事务中拥有1和4。与MQ解决方案相比,这也为您提供隔离,因为您从未观察到1的效果而没有4的影响。