队列中的事务支持 (MSMQ)
Transaction support in Queues (MSMQ)
我正在尝试了解 MSMQ 上事务消息传递的概念以及 wcf 中的事务支持。
对于支持事务的队列,是否意味着下面的一组操作将是自动的?
- 机器 1 上的客户端 A 在其应用程序数据库中写入一行消息发送到队列。
- Creates/Sends 订单创建消息到队列(比如 MSMQ)。
- MSMQ 消息被计算机 2 上的客户端 B 接收。
- 客户端 B 在其自己的应用程序数据库中创建订单行?
如果我在分布式事务中执行上述所有步骤,是否意味着所有 4 个步骤都将自动失败或成功?
或者交易只适用于第 1 - 2 步?
同样,如果说上面涉及 WCF 而不是 MSMQ,所有步骤是否都是原子的,即在一个事务中?
简答:1+2是一笔交易,那么3+4是第二次交易。
3 可能与 2 在同一事务中的唯一方法是接收方与发送方处于相同的事务上下文中(即,相同的逻辑执行线程)。否则,由于第一个事务尚未提交,消息将不可见以供接收。要将事务上下文从发送方传播到接收方,必须有从发送方到接收方的第二个通信通道(即远程调用),这会使消息队列变得冗余。但这实际上没有意义,因为接收甚至可能从队列中得到不同的消息...
事实上,事务性MQ的要点恰恰是在两个不同的事务中将发送方和接收方解耦,这样发送方就不会受到接收方可用性和性能的影响,而代价是隔离。因此,MQ 提供存储和转发原子性+持久性,而无需在同一事务上下文中有两个不同的应用程序(1 和 4)。您将以原子方式拥有 1+2,最终以原子方式拥有 3+4。
使用 WCF,通过使用 WS-AtomicTransactions 而不是 MQ,您可以在同一个事务中拥有 1 和 4。与 MQ 解决方案相比,这也为您提供了隔离,因为您永远不会在没有 4 的影响的情况下观察到 1 的影响。
我正在尝试了解 MSMQ 上事务消息传递的概念以及 wcf 中的事务支持。
对于支持事务的队列,是否意味着下面的一组操作将是自动的?
- 机器 1 上的客户端 A 在其应用程序数据库中写入一行消息发送到队列。
- Creates/Sends 订单创建消息到队列(比如 MSMQ)。
- MSMQ 消息被计算机 2 上的客户端 B 接收。
- 客户端 B 在其自己的应用程序数据库中创建订单行?
如果我在分布式事务中执行上述所有步骤,是否意味着所有 4 个步骤都将自动失败或成功?
或者交易只适用于第 1 - 2 步?
同样,如果说上面涉及 WCF 而不是 MSMQ,所有步骤是否都是原子的,即在一个事务中?
简答:1+2是一笔交易,那么3+4是第二次交易。
3 可能与 2 在同一事务中的唯一方法是接收方与发送方处于相同的事务上下文中(即,相同的逻辑执行线程)。否则,由于第一个事务尚未提交,消息将不可见以供接收。要将事务上下文从发送方传播到接收方,必须有从发送方到接收方的第二个通信通道(即远程调用),这会使消息队列变得冗余。但这实际上没有意义,因为接收甚至可能从队列中得到不同的消息...
事实上,事务性MQ的要点恰恰是在两个不同的事务中将发送方和接收方解耦,这样发送方就不会受到接收方可用性和性能的影响,而代价是隔离。因此,MQ 提供存储和转发原子性+持久性,而无需在同一事务上下文中有两个不同的应用程序(1 和 4)。您将以原子方式拥有 1+2,最终以原子方式拥有 3+4。
使用 WCF,通过使用 WS-AtomicTransactions 而不是 MQ,您可以在同一个事务中拥有 1 和 4。与 MQ 解决方案相比,这也为您提供了隔离,因为您永远不会在没有 4 的影响的情况下观察到 1 的影响。