Как я могу использовать транзакции, которые охватывают процедуры, связанные на нескольких серверах?

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

У меня есть два сервера SQL Server 2005. Давайте для аргументации назовем их Server1 и Server2 [удерживайте аплодисменты], каждый из которых содержит фиктивную базу данных. Фиктивная база данных на сервере Server1 называется источником, а база данных на сервере Server2 - местом назначения для простоты. Каждая база данных содержит одну таблицу с именами Input и Output соответственно, поэтому структура квази объясняется следующим образом:

  • Server1.Source.dbo.Input
  • Server2.Destination.dbo.Output

У меня есть хранимая процедура на Server2 с именем WriteDataToOutput, которая получает один аргумент Varchar и записывает его содержимое в выходную таблицу.

Теперь начинается хитрость:

  1. Я хочу создать хранимую процедуру на Server1.Source, которая вызывает хранимую процедуру WriteDataToOutput, определенную на Server2, что кажется простым шагом.
  2. Я хочу, чтобы этот вызов был частью транзакции, чтобы в случае сбоя вызывающей его процедуры откатывалась вся транзакция.

И здесь заканчиваются мои знания о том, что мне делать. Может кто-то указать мне верное направление? Я пробовал это в двух разных базах данных на одном сервере, и он работал нормально, что заставило меня предположить, что он будет работать на разных серверах. Вопрос в том, как мне это сделать? С чего мне начать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
1 480
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вам нужно связать серверы:

http://msdn.microsoft.com/en-us/library/aa213778.aspx

В качестве альтернативы вы можете просто создать пакет DTS / SSIS.

Dalin Seivewright 16.01.2009 00:19

@Dalin - может ли пакет DTS / SSIS запускаться из запроса / хранимой процедуры, и если да, можно ли его откатить в случае сбоя транзакции?

BenAlabaster 16.01.2009 00:27

для шага 2 вам необходимо запустить координатор распределенных транзакций, вам также необходимо использовать SET XACT_ABORT ON, чтобы убедиться, что все откатится вам также необходимо включить RPC, который по умолчанию отключен в 2005 году и выше.

Есть целая куча вещей, которые могут укусить вас в шею

Используя связанные серверы, вы можете запускать хранимые процедуры на любом сервере в рамках одной транзакции с помощью DTC (координатора распределенных транзакций). Вы обязательно захотите провести некоторый анализ производительности. Я обнаружил, что некоторые SP, использующие ссылки, могут резко снизить производительность базы данных, особенно если вы попытаетесь объединить наборы результатов с каждого из двух серверов.

+1 Спасибо за совет, я бы посмотрел на его использование для переноса определенных финансовых данных из операционной базы данных в финансовую базу данных. Таким образом, нет необходимости в перекрестных соединениях БД.

BenAlabaster 16.01.2009 00:20

Настройте связанный сервер, тогда вы сможете выполнять операции выбора / вставки / обновления на серверах. Что-то вроде:

INSERT INTO Server2.Destination.dbo.Output
SELECT * FROM Input  
WHERE <Criteria>

Предполагается, что вы выполняете запрос от Server1.Source, поэтому вам не нужно полностью соответствовать требованиям.

Я бы вызвал хранимую процедуру, определенную на Server2.

BenAlabaster 16.01.2009 00:16

не забывайте, что он хочет все откатить, поэтому вам нужно запустить DTC, SET XACT_ABORT ON

SQLMenace 16.01.2009 00:29
Ответ принят как подходящий

Как отмечали другие, я согласен с тем, что связанный сервер - лучший способ.

Вот пара указателей, которые уловили меня, когда я впервые имел дело со связанными серверами:

  • Если связанный сервер является экземпляром, убедитесь, что вы заключили имя в скобки. Например [ИМЯ СЕРВЕРА \ ИМЯ ЭКЗЕМПЛЯТА].

  • Используйте псевдоним для таблицы или представления со связанного сервера, иначе вы получите ошибку «Не удается связать составной идентификатор». Существует ограничение, состоящее из 4 частей. Например, SERVER.DATABASE.dbo.TABLE.FIELD состоит из пяти частей и выдаст ошибку. Однако SELECT linked.FieldName FROM SERVER.DATABASE.dbo.TABLE AS linked будет работать нормально.

+1 Спасибо, что указали на возможные подводные камни и решения

BenAlabaster 16.01.2009 00:15

MSDN говорит, что вы можете иметь транзакции между связанными серверами, если используете команду BEGIN DISTRIBUTED TRANSACTION.

Я помню, что у меня были проблемы, называемые хранимой процедурой на связанном сервере, но я работал над этим, а не решал.

Другие вопросы по теме