Кросс-базы данных транзакций от одного SP - PullRequest
3 голосов
/ 02 июня 2010

Мне нужно обновить несколько баз данных с помощью нескольких простых операторов SQL. Базы данных конфигурируются в SQL с использованием «Связанных серверов», а версии SQL смешаны (SQL 2008, SQL 2005 и SQL 2000). Я намереваюсь написать хранимую процедуру в одной из баз данных, но я хотел бы сделать это с помощью транзакции, чтобы убедиться, что каждая база данных обновляется последовательно.

Что из следующего является наиболее точным:

  1. Будет ли работать одна транзакция BEGIN / COMMIT, чтобы гарантировать, что все операторы во всех базах данных будут успешными?
  2. Потребуются ли мне несколько начальных транзакций для каждого отдельного набора команд в базе данных?
  3. Поддерживаются ли транзакции даже при обновлении удаленных баз данных? Мне нужно выполнить удаленный SP с поддержкой встроенных транзакций.

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

Любые другие предложения приветствуются. Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 июня 2010

Это возможно. Вы можете использовать явный BEGIN DISTRIBUTED TRANSACTION в своей управляющей процедуре или просто запустить обычную транзакцию и полагаться на DTC, чтобы повысить транзакцию до распределенной в тот момент, когда вы переходите на связанный сервер, это происходит автоматически. См. Распределенные транзакции Transact-SQL в MSDN.

Однако я должен предупредить вас, что это скользкий склон. Количество сбоев и время простоя резко возрастают, как только вы выводите на экран DQ (распределенные запросы). Если у вас есть 99,5% серверов времени бездействия (т. Е. 43 часа простоя в год) и ваш запрос затрагивает 5 серверов, ваша доступность становится 97,5% (216 часов простоя в год). При 10 серверах время работы увеличивается на 95% (428 часов простоя в год). Такие вещи, как управление развертыванием исправлений ОС, обновление SP движка или обслуживание приложений (думаю, перестройка индекса и т. Д.), Становятся кошмаром для организации и координации.

Для этого нужно разъединить серверы, использовать что-то вроде Service Broker вместо DQ.

1 голос
/ 02 июня 2010

Вы должны быть в состоянии выполнить # 1, используя распределенную транзакцию. Вам потребуется активная DTC, и вам нужно будет использовать BEGIN DISTRIBUTED TRANSACTION вместе с ROLLBACK TRANSACTION и COMMIT TRANSACTION в вашей хранимой процедуре.

Работа с DTC может привести к большим ошибкам, так что удачи:)

...