事务消息传送

事务消息传送是 Service Broker 编程模型的基础。涉及 Service Broker 的任何操作都是当前事务的一部分。当前事务提交后,Service Broker 才会提交消息传送操作。如果相应事务回滚,数据库引擎将保证该事务中的所有消息传送操作也随之回滚。应用程序会在管理 SQL Server 事务时管理消息传送操作。

例如,当程序在某事务内发送消息时,Service Broker 会在程序提交该事务后才通过网络发送此消息。程序在某事务内接收消息时,数据库引擎会在程序提交该事务后才将此消息从队列中永久删除。

事务消息传送通过确保数据库状态与队列状态保持一致,可帮助您编写可靠且可伸缩的应用程序。当应用程序对数据库进行更改并发送或接收消息时,对数据库的更改以及消息传送操作包含在同一事务中。如果事务回滚,则对数据库的更改以及消息传送操作也会回滚。要么两个操作都成功,要么两个操作都失败。在 Service Broker 模型中,应用程序使用事务消息传送保证其发送的消息能反映数据库的当前状态。

若要充分利用事务消息传送的功能,您可以编写使消息传送操作与消息代表的数据库操作发生在同一事务中的应用程序。例如,处理订单的应用程序在同一个事务中接收相应订单的消息并用该订单更新数据库。

否则,如果应用程序在一个事务中接收消息,而在另一个事务中更新数据库,则更新数据库失败后会产生这样一种情形:相应的消息不再存在,但该消息请求的更改并未发生。在这种情况下,该应用程序没有利用 Service Broker 提供的主要优点之一。特别值得一提的是,Service Broker 可保证所有消息按顺序传送,且只传送一次,否则会通过 Service Broker 错误消息通知消息发送方。如果应用程序已从队列中永久删除相应消息,但无法处理该消息(如此示例所述),则该应用程序不能实现此保证。如果不能实现此保证,则该应用程序必须包含其他代码以处理可能的不一致,否则可能会得到错误结果。

如果应用程序对相应消息进行处理,但不对数据库进行任何更改,则会实现此保证。因为该消息已得到成功处理。使用 Service Broker 的应用程序可以选择忽略消息,但不能无意丢失消息,即使在该应用程序失去与数据库的连接或意外退出的情况下也同样如此。