2009-05-20 6 views
6

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

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

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

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

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

Если да, то как я его правильно настроил?

EDIT:

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

ответ

5

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

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

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

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

Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards. В частности, он отмечает требования к ОС (что в значительной степени не должно быть проблемой, но стоит отметить). Кроме того, если обе базы данных и клиент находятся на одном компьютере, необходимо включить сетевой DTC.

1

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

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

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

0

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

0

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

1

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

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

  1. Martin Fowler notes: «Вы должны обратить внимание на порядок ваших фиксаций, получая более важные в первом На каждой фиксации вы должны убедитесь, что он преуспел и решит, что делать, если он не сработает ».
  2. Interview regarding eBay architecture
-1

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

Документация MSDN о том, как настроить MSDTC, довольно сложна и охватывает конкретно задаваемые вами вопросы: Enable Firewall Exceptions for MS DTC, Configuring Security for Distributed Transactions.

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

0

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

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

Проверить его на:

MS DTC Distributed transactions: Oracle 10gR2, SQL Server 2005 and Windows Server 2008 R2