#sql-server #sql-server-2008 #transactions #service-broker
#sql-сервер #sql-server-2008 #транзакции #service-broker
Вопрос:
Мы изучаем различные подходы для обмена данными между двумя разными экземплярами SQL Server. Одним из желаемых рабочих процессов является отправка некоторого сообщения на «удаленную» сторону с запросом, скажем, на удаление записи. Когда эта система завершает удаление, она сохраняет свою транзакцию открытой и отправляет ответ обратно инициатору, который затем удаляет соответствующую запись, фиксирует свою транзакцию, а затем отправляет сообщение обратно «удаленной» стороне, сообщая ей, наконец, также зафиксировать удаление на своей стороне.
Это неудачное приближение двухфазной фиксации. В департаменте ведутся религиозные дебаты о том, может ли SQL Server Service Broker или не может обрабатывать сценарии такого типа достаточно чисто. Кто-нибудь может пролить свет на то, может ли это? Есть опыт работы с подобными типами рабочих процессов? Есть ли лучший механизм, на который мне следует обратить внимание для достижения этой цели, учитывая, что экземпляры SQL Server находятся на отдельных компьютерах, не относящихся к домену?
Редактировать: Чтобы уточнить, мы не можем использовать распределенные транзакции из-за того, что сетевая безопасность является жесткой и несколько произвольной. Нам не разрешена конфигурация, которая сделала бы это возможным.
Ответ №1:
Если я не неправильно понимаю требования, я бы сказал, что это идеальная работа для Service Broker. Service Broker освобождает вас от необходимости использования распределенных транзакций и 2PC. Что вы делаете с Service Broker, так это сводите проблему к локальным транзакциям и обмену транзакционными сообщениями между серверами.
В вашем конкретном случае один из серверов удалил бы свою запись, а затем (как часть той же транзакции) отправил сообщение другому серверу с запросом на удаление соответствующей записи. После постановки сообщения в очередь первый сервер может зафиксировать транзакцию и забыть все это, не дожидаясь синхронизации со вторым сервером. Service Broker гарантирует, что после фиксации сообщения в очереди сообщение будет транзакционно доставлено адресату, который затем может удалить свою запись как часть той же транзакции, в которой он получил сообщение, таким образом, гарантируя, что обработка сообщения и изменения данных являются атомарными.
Комментарии:
1. я полностью согласен с этим. единственное, на что вам следует обратить внимание, это то, что обмен сообщениями происходит не сразу, но, как и в любой системе на основе SOA, это происходит тогда, когда это происходит. Если это не вариант, то Service Broker у вас работать не будет.
2. Я собираюсь принять этот ответ, поскольку я думаю, что вы правы в том, что гарантированная доставка Service Broker устраняет необходимость в механизме 2PC. Я не думал об этом совсем так, как вы выразились. Спасибо!
Ответ №2:
Вы пробовали использовать разделенную транзакцию?
Он выполнит все, что вам нужно, но каждому серверу потребуется подключиться друг к другу как к связанному серверу.
Комментарии:
1. Спасибо! Это хорошее предложение, но у нас оно не сработает, поскольку из-за проблем с сетевой безопасностью мы не можем использовать связанные серверы.