事务消息传送是 Service Broker 编程模型的基础。 涉及 Service Broker 的任何操作都是当前事务的一部分。 当前事务提交之前,Service Broker 不会提交消息传送操作。 如果相应事务回滚,数据库引擎将保证该事务中的所有消息传送操作也随之回滚。 应用程序会在管理 SQL Server 事务时管理消息传送操作。
例如,当程序在事务中发送消息时,在程序提交事务之前,Service Broker 不会通过网络发送消息。 当程序在事务中收到消息时,在程序提交事务之前,数据库引擎不会永久删除队列中的消息。
事务消息传送通过确保数据库状态与队列状态保持一致,可帮助您编写可靠且可伸缩的应用程序。 当应用程序对数据库进行更改并发送或接收消息时,对数据库的更改以及消息传送操作包含在同一事务中。 如果事务回滚,则对数据库的更改以及消息传送操作也会回滚。 要么两个操作都成功,要么两个操作都失败。 在 Service Broker 模型中,应用程序使用事务消息传送保证其发送的消息能反映数据库的当前状态。
若要充分利用事务消息传送的功能,您可以编写使消息传送操作与消息代表的数据库操作发生在同一事务中的应用程序。 例如,处理订单的应用程序在同一个事务中接收相应订单的消息并用该订单更新数据库。
如果应用程序在一个事务中接收消息,而在另一个事务中更新数据库,则数据库更新失败会导致消息不复存在,但消息请求的更改却未发生。 在这种情况下,应用程序不会利用 Service Broker 提供的主要优势之一。 Service Broker 特别保证所有消息都精确且按顺序传递一次,或者消息发送方会收到 Service Broker 的错误通知。 从队列中永久删除消息但无法像此示例中一样处理消息的应用程序会中断此保证。 如果不能实现此保证,则该应用程序必须包含其他代码以处理可能的不一致,否则可能会得到错误结果。
如果应用程序对相应消息进行处理,但不对数据库进行任何更改,则会实现此保证。 因为该消息已得到成功处理。 使用 Service Broker 的应用程序可能会选择忽略消息,但应用程序不得无意中丢失消息,即使在应用程序与数据库断开连接或意外退出的情况下也是如此。