2009-05-20 11 views
6

Używam ramy .NET 2.0/3.5 dla mojej aplikacji. Muszę uruchomić kilka poleceń SQL w wielu połączeniach, a każde połączenie jest na innym serwerze (Oracle, SQL Server). Muszę się upewnić, że te polecenia są transakcyjne.Wiele poleceń transakcyjnych SQL w różnych połączeniach z bazą danych

Na przykład: Muszę wykonać INSERT w tabeli w bazach danych Oracle i SQL Server, a następnie zatwierdzić je, jeśli nie zostały zgłoszone żadne wyjątki. Jeśli wystąpił wyjątek, w razie potrzeby chciałbym przywrócić oba serwery.

Podejrzewam, że będę musiał użyć System.Transactions i TransactionScope. Będzie to wymagać ustawienia Microsoft Distributed Transaction Coordinator (MSDTC) na serwerach baz danych, a także na serwerze aplikacji.

Wyglądałem na wysoki i niski i nie mogłem znaleźć artykułów opisujących krok po kroku konfigurowanie MSDTC z wzajemnym uwierzytelnianiem (w tym konfigurowanie ustawień zapory i ustawień MSDTC.) Przyjrzałem się dokumentacji Microsoft dotyczącej konfigurowania MSDTC, ale wydaje się całkowicie bezwartościowy i nie w pełni udokumentowany (chyba że możesz znaleźć mi naprawdę dobry artykuł MSDN na temat konfiguracji).

Czy używanie MSDTC jest jedynym sposobem na wykonanie mojej pracy?

Jeśli tak, to w jaki sposób mogę go poprawnie skonfigurować?

EDIT:

  • używam Windows Server 2003 dla wszystkich maszyn.
  • Mam dwa SQL Server's. Jednym z nich jest SQL Server 2000, a drugi to rok 2005.
  • Mam jeden serwer Oracle i jest to wersja 11g
  • Aplikacja, którą rozwijamy, czasami musi zmieniać/tworzyć rekordy we wszystkich trzech bazach danych w sposób transakcyjny.
  • To nie problem między klawiaturą a krzesłem. Czytamy artykuły na temat MSDN, jak skonfigurować wszystko, co dotyczy MSDTC, ale nie możemy sprawić, aby DTCP i inne aplikacje testujące działały. Szukaliśmy artykułu krok po kroku opisującego proces. Natknąłem się na dokumentację MSDN na więcej niż jeden raz, że "pominąłem" kroki, aby zrobić pewne rzeczy.

Odpowiedz

5

Niestety zarówno oficjalna dokumentacja obu dostawców zdaje się być w stanie wspomnieć o dostawcach usług interopcyjnych, jak i innych, ale obaj zdają się nie zgadzać się na potwierdzenie istnienia oferty bazy danych drugiej strony.

Możesz potrzebować dokumentacji na temat Oracle Services for Microsoft Transaction Server.

  • Oracle Dokumentacja: istnieje
    • 10g
    • 9i
    • Starsze wersje ale wiele wydaje się zmieniły po 8

Od ODP.NET 10.2.0.3 r powinieneś (jeśli masz odpowiednio skonfigurowane MS DTC i OraMTS dll jest obecny) być w stanie po prostu użyć TransactionScope System.Transactions tak, jakbyś koordynował między dwiema bazami danych serwera sql, ale używając serwera sql i połączenia Oracle. Odtąd może być wymagana wersja Oracle 10, aby działała po prostu po wyjęciu z pudełka.

Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards. W szczególności odnotowuje wymagania systemu operacyjnego (które w dużej mierze nie powinny już być problemem, ale warto je zauważyć). Ponadto, jeśli obie bazy danych i klient znajdują się na tym samym komputerze, należy włączyć DTC sieci.

1

Używam serwerów połączonych do wszystkich moich zadań w ten sposób. Ułatwia nam zarządzanie informacjami o połączeniu i danymi uwierzytelniającymi. Zasadniczo jeden przystanek na zakupy dla wszystkich naszych potrzeb.

Edycja: Więcej szczegółów - Mamy jedną bazę danych wykorzystywaną wyłącznie do raportowania. Otrzymujemy nasze dane z serwera w całej korporacji. Nie mamy jednego konta umożliwiającego dostęp do tych serwerów, niektóre z nich korzystają z funkcjonalnego identyfikatora, a inne z naszych referencji AD. Zawijanie wszystkich tych połączeń na oddzielne połączone serwery działa najlepiej dla nas. Na naszym serwerze raportowania mamy obecnie 16 połączonych serwerów.

Zawijamy również nasze zapytania do widoków, aby ułatwić dostęp do naszych aplikacji i raportów kryształów. Dlatego zamiast tworzyć wiele ciągów połączeń w naszym kodzie, używamy tylko jednego globalnego ciągu do połączenia z raportowaniem Db.

0

Jest to klasyczny problem z rozproszonymi transakcjami i do czego służy MSDTC. Wyszukaj monitory transakcji i protokół XA, aby uzyskać głębszy opis tej klasy problemu.

0

Podczas korzystania z wielu połączeń konieczne jest użycie kodu DTC.Pojedyncze połączenie może zarządzać pojedynczą transakcją, ale jeśli masz wiele połączeń, będziesz potrzebować koordynatora transakcji do obsługi protokołu zatwierdzania dwufazowego.

1

Moja odpowiedź może być nieco dziwna, ale zalecam (o ile jest to technicznie możliwe) ocenić użycie 2 niezależnych transakcji dla każdej bazy danych. Moje obawy dotyczące transakcji rozproszonych/XA to ogólna wydajność bazy danych/skalowalność/opóźnienie.

2 linki, które starają się udowodnić mój punkt widzenia.

  1. Martin Fowler notes: „Trzeba zwrócić uwagę na kolejność swoich zatwierdzeń, coraz ważniejsze te w pierwszym Na każdy popełnić trzeba sprawdź, czy się udało i zdecyduj, co zrobić, jeśli się nie powiedzie. "
  2. Interview regarding eBay architecture
-1

Tak, musisz utworzyć obszar transakcji oraz dostawcy ADO.NET SQL i Oracle zapisać każde połączenie w jedno rozproszonych transakcji, koordynowany przez MSDTC.

Dokumentacja MSDN na temat konfiguracji MSDTC jest dość skomplikowana i obejmuje w szczególności zadawane pytania: Enable Firewall Exceptions for MS DTC, Configuring Security for Distributed Transactions.

Nie wspominając o systemie operacyjnym, w którym działa klient, wersji programu SQL Server, wersji Oracle, systemie zaplecza dla SQL Server (s) i Oracle (s). Ignorujesz również każdy napotkany problem lub komunikat o błędzie, który widziałeś. W tej chwili problem wydaje się znajdować gdzieś pomiędzy klawiaturą a krzesłem.