使用英语阅读

通过


事务性消息处理

更新:2007 年 11 月

利用事务性处理,您可以确保事务中的消息按照顺序传送,只传送一次,并且从目的队列成功地被检索。MessageQueue 组件可用于通过事务收发消息。当您在事务中发送消息时,可以将相关的消息归入一组。事务中包含的所有消息要么按发送顺序一起传送(“提交”的事务),要么在出现问题时自动停止收发(“中止”的事务)。

从应用程序中,主要可以创建以下两种事务:

  • “内部事务”用于在两个或多个“消息队列”资源之间(即,在属于“消息队列”企业级的两个队列之间)发送消息。

  • “外部事务”用于在队列和其他资源(如数据库)之间发送消息。

外部事务和内部事务在以下方面有所不同:编程模型、用于控制事务的资源管理器以及使用模式。

内部事务

内部事务是通过创建 MessageQueueTransaction 类的实例并将该实例关联到 MessageQueue 组件的实例来执行的。内部事务是最简单的事务类型。消息在一个或多个消息队列之间发送,“消息队列”的事务协调器控制发生的操作。由于您手动控制进程中这些步骤,因此可以将内部事务视为手动或显式事务,而将外部事务视为自动或隐式事务。

内部事务的编程模型非常简单,只需调用 MessageQueueTransaction 类的 Begin 方法,并将此类的实例传递到收发方法。然后,调用 Commit 以将事务的更改保存到目标队列。有关更多信息,请参见如何:在内部事务中发送消息

内部事务的功能比较有限,因为您无法使用非消息队列资源(如数据库)执行事务。如果要在事务中与数据库进行交互,则必须使用外部事务。尽管内部事务具有上述限制,但其性能还是优于外部事务。

内部事务和外部事务都要求您将消息发送到已标记为“事务性”的队列中。有关更多信息,请参见如何:创建事务性队列

外部事务

外部事务通常用于在队列和其他类型的资源之间发送消息。例如,您可能要从队列检索消息并将其发送到数据库,或者恰恰相反。外部事务与内部事务的区别如下:

  • 外部事务依赖于不属于“消息队列”系统的协调器。大多数情况下,它将是 Microsoft 分发式事务处理协调器 (DTC)。DTC 在事务中登记必要资源,并控制从整体上确定事务中的所有操作成败与否的进程。

  • 外部事务具有更加复杂的编程模型。您不仅仅是调用 BeginCommitAbort,而是指定表示外部事务的属性并将组件注册到 COM+ 1.0 服务。您还必须使用特殊形式的 Send 和 Receive 方法,这些方法采用事务类型的参数并将此字段设置为 Automatic。

此外还有其他类型的事务可以不使用 MessageQueue 组件进行发送。有关 Visual Studio 或 .NET Framework 中事务的更多信息,请参见下列主题:

有关更多信息

请参见

演示用于外部事务的属性的示例

请参见 MSDN Online。

C++ 中的事务

事务

请参见

任务

如何:创建事务性队列

如何:在内部事务中发送消息

其他资源

读取和接收消息