Поделиться через


Обмен сообщениями на основе транзакций

Модель программирования компонента Service Broker построена на принципе обмена транзакционными сообщениями. Любая операция, в которой участвует компонент Service Broker, является частью текущей транзакции. Компонент Service Broker не фиксирует операцию обмена сообщениями, пока не зафиксирована текущая транзакция. Если выполняется откат транзакции, компонент Database Engine гарантирует откат всех операций по обмену сообщениями, которые входят в эту транзакцию. Приложение управляет операциями по обмену сообщениями в ходе управления транзакциями SQL Server.

Например, когда программа отправляет сообщение в рамках транзакции, компонент Service Broker не отправляет сообщение по сети, пока программа не зафиксирует транзакцию. Когда программа получает сообщение в рамках транзакции, компонент Database Engine не выполняет окончательное удаление сообщения из очереди, пока программа не зафиксирует транзакцию.

Обмен транзакционными сообщениями помогает создавать надежные в работе масштабируемые приложения, обеспечивая согласованность состояния базы данных с состоянием очередей. Когда приложение вносит изменение в базу данных и отправляет или получает сообщение, изменение в базе данных и операция с сообщением входят в одну и ту же транзакцию. Если транзакция подвергается откату, то выполняется откат и изменения в базе данных, и операции с сообщением. Обе операции либо выполняются успешно, либо завершаются ошибкой. В модели компонента Service Broker приложение использует обмен транзакционными сообщениями, чтобы Гарантировать, что в сообщениях, отправляемых приложением, отражается текущее состояние базы данных.

Чтобы использовать все преимущества обмена транзакционными сообщениями, следует создавать собственные приложения таким образом, чтобы операции с сообщениями выполнялись в той же транзакции, что и операции с базой данных, которые представляют эти сообщения. Например, приложение, которое обрабатывает заказ, получает сообщение о заказе и обновляет базу данных, добавляя заказ, в рамках единой транзакции.

Если же приложение получает сообщение в одной транзакции, а обновляет базу данных в другой транзакции, то в случае, когда не удается обновить базы данных, возникает ситуация, где сообщение уже не существует, но изменение, запрошенное сообщением, не было внесено. В таком случае приложение не использует одно из главных преимуществ, предоставляемых компонентом Service Broker. В частности, компонент Service Broker гарантирует, что все сообщения доставляются по порядку и ровно один раз. В противном случае отправитель сообщения получает от компонента Service Broker сообщение об ошибке. Однако эта гарантия нарушается, если приложение, которое окончательно удаляет сообщение из очереди, не может его обработать, как в данном примере. В отсутствие такой гарантии приложение должно содержать дополнительный код для обработки возможных противоречий или принять риск получения неверных результатов.

Если приложение обрабатывает сообщение и не вносит изменений в базу данных, гарантия действует. Сообщение было обработано успешно. Приложение, использующее компонент Service Broker, может не обрабатывать сообщение, но необходимо исключить возможность случайной потери сообщения, даже в ситуациях, когда приложение теряет связь с базой данных или завершает работу непредвиденным образом.