Как я могу использовать транзакции, которые охватывают процедуры, связанные между несколькими серверами? - PullRequest
6 голосов
/ 15 января 2009

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

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

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

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 16 января 2009

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

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

  • Если связанный сервер является экземпляром, убедитесь, что вы заключили в скобки имя. Например, [SERVERNAME \ INSTANCENAME].

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

5 голосов
/ 15 января 2009

Вы хотите связать серверы:

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

3 голосов
/ 16 января 2009

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

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

2 голосов
/ 16 января 2009

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

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

1 голос
/ 16 января 2009

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

0 голосов
/ 16 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...