事务性消息处理
更新:2007 年 11 月
利用事务性处理,您可以确保事务中的消息按照顺序传送,只传送一次,并且从目的队列成功地被检索。MessageQueue 组件可用于通过事务收发消息。当您在事务中发送消息时,可以将相关的消息归入一组。事务中包含的所有消息要么按发送顺序一起传送(“提交”的事务),要么在出现问题时自动停止收发(“中止”的事务)。
从应用程序中,主要可以创建以下两种事务:
“内部事务”用于在两个或多个“消息队列”资源之间(即,在属于“消息队列”企业级的两个队列之间)发送消息。
“外部事务”用于在队列和其他资源(如数据库)之间发送消息。
外部事务和内部事务在以下方面有所不同:编程模型、用于控制事务的资源管理器以及使用模式。
内部事务是通过创建 MessageQueueTransaction 类的实例并将该实例关联到 MessageQueue 组件的实例来执行的。内部事务是最简单的事务类型。消息在一个或多个消息队列之间发送,“消息队列”的事务协调器控制发生的操作。由于您手动控制进程中这些步骤,因此可以将内部事务视为手动或显式事务,而将外部事务视为自动或隐式事务。
内部事务的编程模型非常简单,只需调用 MessageQueueTransaction 类的 Begin 方法,并将此类的实例传递到收发方法。然后,调用 Commit 以将事务的更改保存到目标队列。有关更多信息,请参见如何:在内部事务中发送消息。
内部事务的功能比较有限,因为您无法使用非消息队列资源(如数据库)执行事务。如果要在事务中与数据库进行交互,则必须使用外部事务。尽管内部事务具有上述限制,但其性能还是优于外部事务。
内部事务和外部事务都要求您将消息发送到已标记为“事务性”的队列中。有关更多信息,请参见如何:创建事务性队列。
外部事务通常用于在队列和其他类型的资源之间发送消息。例如,您可能要从队列检索消息并将其发送到数据库,或者恰恰相反。外部事务与内部事务的区别如下:
外部事务依赖于不属于“消息队列”系统的协调器。大多数情况下,它将是 Microsoft 分发式事务处理协调器 (DTC)。DTC 在事务中登记必要资源,并控制从整体上确定事务中的所有操作成败与否的进程。
外部事务具有更加复杂的编程模型。您不仅仅是调用 Begin、Commit 和 Abort,而是指定表示外部事务的属性并将组件注册到 COM+ 1.0 服务。您还必须使用特殊形式的 Send 和 Receive 方法,这些方法采用事务类型的参数并将此字段设置为 Automatic。
此外还有其他类型的事务可以不使用 MessageQueue 组件进行发送。有关 Visual Studio 或 .NET Framework 中事务的更多信息,请参见下列主题:
有关更多信息 |
请参见 |
---|---|
演示用于外部事务的属性的示例 |
请参见 MSDN Online。 |
C++ 中的事务 |