Транзакционная обработка сообщений
Обновлен: Ноябрь 2007
Транзакционная обработка сообщений позволяет гарантировать, что сообщения в транзакции доставляются строго один раз и в нужном порядке, а также успешно извлекаются из конечной очереди. Для транзакционной отправки и транзакционного получения сообщений можно использовать компонент MessageQueue. При отправке сообщений внутри транзакции выполняется группировка набора связанных сообщений. Все содержащиеся в транзакции сообщения либо доставляются вместе в том порядке, в котором они были отправлены (успешно завершенная транзакция), либо не отправляются и не принимаются автоматически при возникновении каких-либо ошибок (прекращенная транзакция).
Существует два основных типа транзакций, которые можно создать из приложений:
Внутренние транзакции используются для обмена сообщениями между двумя или более ресурсами очередей сообщений, то есть между двумя очередями, относящимися к системе со службой очередей сообщений.
Внешние транзакции используются для обмена сообщениями между очередями и другими ресурсами, например базами данных.
Внешние и внутренние транзакции имеют различия в модели программирования, в используемом для управления транзакцией менеджере ресурсов и в способах их использования.
Внутренние транзакции
Внутренние транзакции выполняются путем создания экземпляра класса MessageQueueTransaction и его сопоставления с экземпляром компонента MessageQueue. Внутренняя транзакция является самым простым типом транзакции. Обмен сообщениями производится между одной или несколькими очередями сообщений, при этом происходящими действиями управляет диспетчер транзакционных очередей сообщений. Поскольку управление данными этапами процесса производится вручную, внутренние транзакции могут рассматриваться как неавтоматические или явные транзакции, в то время как внешние транзакции являются автоматическими или неявными.
Модель программирования внутренних транзакций очень проста: необходимо вызвать метод Begin класса MessageQueueTransaction и передать экземпляр этого класса методу отправки или получения. Затем вызывается метод Commit для сохранения изменений транзакции в конечной очереди. Дополнительные сведения см. в разделе Практическое руководство. Отправка сообщений во внутренних транзакциях.
Внутренние транзакции несколько ограничены в своих функциях. Примером этого является отсутствие возможности выполнять транзакции с ресурсами, не имеющими очередей сообщений (например, с базами данных). Если в ходе транзакции есть необходимость взаимодействия с базой данных, следует использовать внешние транзакции. Однако, несмотря на эти ограничения, внутренние транзакции имеют большую производительность, чем внешние.
Как внутренние, так и внешние транзакции требуют, чтобы сообщения отправлялись в очередь, которая помечена как транзакционная. Дополнительные сведения см. в разделе Практическое руководство. Создание транзакционных очередей.
Внешние транзакции
Внешние транзакции, как правило, используются при обмене сообщениями между очередями и ресурсами иного типа. Например, может потребоваться извлечение сообщения из очереди и его отправка в базу данных или наоборот. Существует несколько различий между внешними и внутренними транзакциями:
Внешние транзакции основываются на использовании диспетчера, который не является частью системы очередей сообщений. В большинстве случаев таким диспетчером является диспетчер распределенных транзакций (DTC) Microsoft. Этот диспетчер выполняет зачисление в транзакцию необходимых ресурсов и управляет процессом, определяющим успешное (или неуспешное) завершение всех действий транзакции как отдельной единицы.
Внешние транзакции имеют более сложную модель программирования. Вместо простого вызова методов Begin, Commit и Abort необходимо задать атрибуты, указывающие на то, что транзакция является внешней, и зарегистрировать компонент с помощью служб COM+ 1.0. Кроме того, необходимо использовать особую форму методов Send и Receive, принимающую параметр типа транзакции, и установить для этого поля значение Automatic.
Существуют другие типы транзакций, которые могут быть отправлены без использования компонента MessageQueue. Дополнительные сведения о транзакциях в Visual Studio или .NET Framework см. в следующих разделах:
Дополнительные сведения о |
См. в разделах |
---|---|
Пример, демонстрирующий использование атрибутов с внешними транзакциями |
См. веб-узел MSDN online. |
Транзакции в языке C++ |
См. также
Задачи
Практическое руководство. Создание транзакционных очередей
Практическое руководство. Отправка сообщений во внутренних транзакциях