Несколько команд транзакций SQL для разных соединений с базой данных - PullRequest
6 голосов
/ 20 мая 2009

Я использую .NET 2.0 / 3.5 Framework для своего приложения. Мне нужно выполнить несколько команд SQL для нескольких соединений, и каждое соединение находится на своем сервере (Oracle, SQL Server). Мне нужно убедиться, что эти команды являются транзакционными.

Например: мне нужно выполнить INSERT в таблице для баз данных Oracle и SQL Server, а затем зафиксировать их, если не было выдано исключений. Если было исключение, я хотел бы откатиться на обоих серверах, если это необходимо.

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

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

Является ли использование MSDTC единственным способом выполнить мою работу?

Если так, как, черт возьми, я правильно его настрою?

EDIT:

  • Я использую Windows Server 2003 для всех компьютеров.
  • У меня есть два сервера SQL. Одним из них является SQL Server 2000, а другим - 2005.
  • У меня есть один сервер Oracle, и это версия 11g
  • Приложение, которое мы разрабатываем, иногда должно изменять / создавать записи во всех трех базах данных транзакционным способом.
  • Это не проблема между клавиатурой и креслом. Мы читаем статьи на MSDN о том, как настроить все, что касается MSDTC, но мы не можем заставить работать DTCPing и другие тестирующие приложения. Мы искали пошаговую статью, подробно описывающую процесс. Я неоднократно сталкивался с документацией MSDN, в которой «пропущены» шаги для выполнения определенных действий.

Ответы [ 7 ]

5 голосов
/ 16 сентября 2009

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

Возможно, вам потребуется документация по Службы Oracle для Microsoft Transaction Server .

  • Документация по Oracle:
    • 10г
    • 9i
    • Старые версии существуют, но, похоже, многое изменилось после 8

Начиная с ODP.NET 10.2.0.3, вы должны (если вы правильно настроили MS DTC и присутствует OraMTS dll), чтобы иметь возможность просто использовать System.Transactions TransactionScope так же, как если бы вы координировали работу двух серверов SQL базы данных, но с использованием сервера SQL и оракула подключения. Oracle 10 и более поздних версий может потребоваться, чтобы это работало довольно просто из коробки.

Вот руководство по использованию DTC из .net 2.0 и Sql Server 2005 и далее . В частности, он отмечает требования к ОС (которые больше не должны быть проблемой, но их стоит отметить). Кроме того, если обе базы данных и клиент находятся на одном компьютере, необходимо включить сетевой код неисправности.

1 голос
/ 16 сентября 2009

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

2 ссылки, которые попытаются доказать мою точку зрения:

  1. Мартин Фаулер отмечает: «Вы должны обращать внимание на порядок ваших коммитов, вначале выбирая более важные. При каждом коммите вы должны проверять его успешность и решать, что делать, если это терпит неудачу. "
  2. Интервью относительно архитектуры eBay
1 голос
/ 20 мая 2009

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

Редактировать: больше подробностей - у нас есть одна база данных, используемая исключительно для отчетности. Мы получаем наши данные с сервера по всей корпорации. У нас нет единой учетной записи для доступа к этим серверам, некоторые из них мы используем функциональный идентификатор, другие наши учетные данные AD. Объединение всех этих соединений в отдельные связанные серверы работает лучше всего для нас. На нашем сервере отчетов у нас сейчас 16 связанных серверов.

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

0 голосов
/ 17 декабря 2011

У меня была такая же проблема. Необходим для выполнения распределенных транзакций между 2 серверами SQL и 1 сервером базы данных Oracle, все это из приложения ASP.Net.

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

Проверьте это по адресу:

MS DTC Распределенные транзакции: Oracle 10gR2, SQL Server 2005 и Windows Server 2008 R2

0 голосов
/ 18 сентября 2009

Да, вам необходимо создать область транзакции, и поставщики ADO.Net для SQL и Oracle будут регистрировать каждое соединение в одну распределенную транзакцию, координируемую MSDTC.

Документация MSDN о том, как настроить MSDTC, довольно сложна и охватывает конкретно задаваемые вами вопросы: Включение исключений брандмауэра для MS DTC , Настройка безопасности для распределенных транзакций .

Не указывайте ОС, на которой работает ваш клиент, версию SQL Server, версию Oracle, внутреннюю ОС для SQL Server (ов) и Oracle (ов). Вы также не можете сообщить о любой фактической проблеме, с которой вы столкнулись, или сообщении об ошибке, которое вы видели. Прямо сейчас проблема, кажется, находится где-то между клавиатурой и стулом.

0 голосов
/ 01 сентября 2009

При использовании нескольких соединений вам потребуется использовать код неисправности. Одно соединение может управлять одной транзакцией, но если у вас несколько соединений, вам потребуется координатор транзакций для обработки протокола двухфазной фиксации.

0 голосов
/ 20 мая 2009

Это классическая проблема распределенных транзакций, для которой и предназначен MSDTC. Посмотрите мониторы транзакций и протокол XA для более глубокого описания этого класса проблем.

...