Можно ли использовать TransactionScope в двух базах данных на одном сервере Microsoft SQL?

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

Поэтому мне было интересно, есть ли способ обойти / решить эту проблему?


person Marko    schedule 08.02.2013    source источник
comment
Какая ошибка? Какая версия SQL Server?   -  person Joe    schedule 08.02.2013
comment
У вас настроен и запущен DTC? technet.microsoft.com/en-us/library /dd337629(v=ws.10).aspx   -  person Pete    schedule 08.02.2013
comment
Я получаю следующую ошибку: диспетчер партнерских транзакций отключил поддержку удаленных / сетевых транзакций. Для меня это мало что говорит, но когда я использую TransactionScope с несколькими запросами в одной и той же базе данных, он работает нормально, поэтому я пришел к выводу, что это связано с охватом диапазона в двух базах данных. Я могу быть не прав. Мы используем 2008 SQL Server. И я не уверен насчет DTC, я должен уточнить у нашего системного администратора ...   -  person Marko    schedule 08.02.2013


Ответы (4)


Не хотите поделиться, что именно написано в ошибке? В любом случае, с моей точки зрения, этот вариант использования должен поддерживаться TransactionScope. Насколько я помню, транзакция будет преобразована в распределенную, и для этого потребуется служба координатора распределенных транзакций (MSDTC) для установки и запуска на вашем компьютере.

РЕДАКТИРОВАТЬ: увидев сообщение об ошибке, кажется, что 2 базы данных находятся на разных машинах, поэтому распределенная транзакция должна выполняться / синхронизироваться по сети. Это означает, что MSDTC установлен, но неправильно настроен для этого варианта использования. Поищите его в документации и поговорите со своим системным администратором.

person Adrian Zanescu    schedule 08.02.2013
comment
Хммм ... Читая эти статьи: stackoverflow.com/questions/761031/ nullablecode.com/2011/02/ кажется, что мне не нужен MSDTC, когда у меня есть один сервер SQL с несколькими базами данных. Похоже, мне нужно найти способ поддерживать одно и то же соединение во всех вызовах базы данных. Как и в моем проекте, теперь я создаю отдельное соединение для каждого вызова базы данных. - person Marko; 08.02.2013

Если вы используете SQL Server 2008, вы можете заключить подключения к тому же SQL Server в область транзакции без MSDTC, при условии, что вы используете одну и ту же строку подключения для каждого подключения.

Чтобы использовать ту же строку подключения, вам нужно будет явно указать имя базы данных (по крайней мере для одной из ваших баз данных) в ваших запросах, например

SELECT ... FROM db1..Table1 ...

SELECT ... FROM db2..Table2 ...
person Joe    schedule 11.02.2013

Вам необходимо убедиться, что MSDTC установлен и настроен. Под настройкой я подразумеваю, что вам нужно включить доступ к сети DTC.

Это может помочь вам начать: http://technet.microsoft.com/en-us/library/cc753866(v=ws.10).aspx

person Pete    schedule 08.02.2013

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

person Rodrigo Vedovato    schedule 08.02.2013
comment
-1 распределенные транзакции действительно возможны в большинстве зрелых баз данных. это совершенно неправильно - person Adrian Zanescu; 08.02.2013