Menedżer transakcji wyłączył obsługę transakcji zdalnych / sieciowych

86

Używam SQL Server i ASP.NET. Mam następującą funkcję:

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

Jednak wyjątek „ Menedżer transakcji wyłączył obsługę transakcji zdalnych / sieciowych. ' Jest rzucony.

Opis JoinScope:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

Pracowałem w ten sposób w innej aplikacji z tym samym środowiskiem bez problemu, ale tutaj mam ten problem. Co mogę zrobić, aby rozwiązać problem?

Lajos Arpad
źródło
Zrobiłem kroki, które Magnus zasugerował jako pierwszy, aby upewnić się, że wszystkie podstawy zostały objęte, że tak powiem, a następnie udało mi się uzyskać błąd sugerujący, że włączam clr w SQL Server i to zadziałało. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Odpowiedzi:

141

Upewnij się, że usługa „Koordynator transakcji rozproszonych” jest uruchomiona zarówno w bazie danych, jak i na kliencie. Upewnij się również, że zaznaczyłeś „Sieciowy dostęp do usługi DTC”, „Zezwalaj na klienta zdalnego”, „Zezwalaj na przychodzące / wychodzące” i „Włącz TIP”.

Aby włączyć dostęp do sieciowej usługi DTC dla transakcji MS DTC

  1. Otwórz przystawkę Usługi składowe.

    Aby otworzyć usługi składowe, kliknij przycisk Start. W polu wyszukiwania wpisz dcomcnfg, a następnie naciśnij klawisz ENTER.

  2. Rozwiń drzewo konsoli, aby zlokalizować usługę DTC (na przykład lokalną usługę DTC), dla której chcesz włączyć dostęp do usługi Network MS DTC.

  3. W menu Akcja kliknij opcję Właściwości.

  4. Kliknij kartę Zabezpieczenia i wprowadź następujące zmiany: W Ustawieniach zabezpieczeń zaznacz pole wyboru Dostęp do usługi DTC w sieci.

    W Komunikacji menedżera transakcji zaznacz pola wyboru Zezwalaj na przychodzące i Zezwalaj na wychodzące.

Magnus
źródło
3
Dziękuję, Magnus. Musi to być ustawienie aplikacji, ponieważ ten typ transakcji działał z tymi samymi komputerami, co oznacza, że ​​problem nie jest związany z maszyną.
Lajos Arpad
Tak. Zgłasza ten sam wyjątek.
Lajos Arpad
Wydaje mi się, że ma to związek z tym, co faktycznie robisz wewnątrz TransactionScope.
Magnus
Potrzebuję również zakresu łączenia, ponieważ chcę, aby ta transakcja była wysyłana jako pojedyncze żądanie do serwera bazy danych.
Lajos Arpad
13
upewnij się, że używasz tego samego otwartego połączenia dla wszystkich wywołań bazy danych w ramach transakcji.
Magnus,
11

Ten problem pojawiał się sporadycznie, postępowałem zgodnie z instrukcjami tutaj i bardzo podobnymi w innych miejscach. Wszystko zostało poprawnie skonfigurowane.

Ta strona: http://sysadminwebsite.wordpress.com/2012/05/29/9/ pomogła mi znaleźć problem.

Zasadniczo miałem zduplikowane CID dla MSDTC na obu serwerach. HKEY_CLASSES_ROOT \ CID

Zobacz: http://msdn.microsoft.com/en-us/library/aa561924.aspx sekcja Upewnij się, że MSDTC ma przypisaną unikalną wartość CID

Pracuję z serwerami wirtualnymi, a nasz zespół serwerów lubi używać tego samego obrazu dla każdego serwera. To prosta poprawka i nie potrzebowaliśmy restartu. Ale usługa DTC wymagała ustawienia na Automatyczne uruchamianie i musiała zostać uruchomiona po ponownej instalacji.

Tod
źródło
9

Miałem procedurę magazynu, która wywołuje inną procedurę magazynu na „serwerze połączonym”. Kiedy wykonuję ją w ssms, było ok, ale kiedy wywołuję ją w aplikacji (przez Entity Framework), otrzymałem ten błąd. Ten artykuł pomógł mi i użyłem tego skryptu:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

aby uzyskać więcej szczegółów, spójrz na to: Serwer połączony: menedżer transakcji partnera wyłączył obsługę transakcji zdalnych / sieciowych

Amirhossein Yari
źródło
1
Link do rozwiązania jest mile widziany, ale upewnij się, że Twoja odpowiedź jest przydatna bez niego: dodaj kontekst wokół linku, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje, a następnie zacytuj najbardziej odpowiednią część strony, którą podałeś. ponowne łącze w przypadku, gdy strona docelowa jest niedostępna. Odpowiedzi, które są niewiele więcej niż linkiem, mogą zostać usunięte.
Petter Friberg
1
To rozwiązało mój problem, więc dziękuję za dostarczenie tego. Nie wiem, dlaczego otrzymałem głos -1, ponieważ zadziałało, aby rozwiązać mój konkretny problem.
Boyd P
6

W moim scenariuszu wyjątek został zgłoszony, ponieważ próbowałem utworzyć nowe wystąpienie połączenia w ramach TransactionScope na już istniejącym połączeniu:

Przykład:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}
Daniel Minnaar
źródło
3

Komentarz z odpowiedzi : "upewnij się, że używasz tego samego otwartego połączenia dla wszystkich wywołań bazy danych wewnątrz transakcji. - Magnus"

Nasi użytkownicy są przechowywani w oddzielnej bazie danych od danych, z którymi pracowałem przy transakcjach. Otwarcie połączenia bazy danych w celu pobrania użytkownika powodowało ten błąd. Przeniesienie innego połączenia bazy danych i wyszukiwania użytkownika poza zakres transakcji naprawiło błąd.

Bakanekobrain
źródło
1

Poniższe rozwiązanie zamieszczam tutaj, bo po kilku poszukiwaniach właśnie tu wylądowałem, więc inne też mogą. Próbowałem użyć EF 6 do wywołania procedury składowanej, ale wystąpił podobny błąd, ponieważ procedura składowana miała używany serwer połączony .

Nie można wykonać operacji, ponieważ dostawca OLE DB _ dla serwera połączonego _ nie mógł rozpocząć transakcji rozproszonej

Menedżer transakcji partnera wyłączył obsługę transakcji zdalnych / sieciowych *

Przeskakuję do klienta SQL rozwiązało mój problem, co również potwierdziło, że jest to sprawa EF.

Próba oparta na metodzie wygenerowanej przez model EF:

db.SomeStoredProcedure();

Próba oparta na ExecuteSqlCommand:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

Z:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

Ten kod można skrócić, ale myślę, że ta wersja jest nieco wygodniejsza do debugowania i przechodzenia przez nią.

Nie wierzę, że Sql Client jest koniecznie preferowanym wyborem, ale czułem, że warto się tym podzielić, jeśli ktoś inny mający podobne problemy zostanie tutaj wylądowany przez Google.

Powyższy kod to C #, ale koncepcja próby przełączenia się na klienta Sql nadal obowiązuje. Przynajmniej próba zrobienia tego będzie miała charakter diagnostyczny.

Greg
źródło
Ciekawy. Myślę, że możesz chcieć edytować rozwiązanie za pomocą kodu VB (dostępne są translatory kodu), aby pasowało do tagów pytania. Niemniej jednak głosowałem za tym.
Lajos Arpad
1

Jeśli nie możesz znaleźć lokalnej usługi DTC w usługach składowych, spróbuj najpierw uruchomić ten skrypt programu PowerShell:

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

I to się pojawia!

Źródło: menedżer transakcji partnera wyłączył obsługę transakcji zdalnych / sieciowych

Arthur Cam
źródło
0

Jeśli inni mają ten sam problem:

Miałem podobny błąd. okazało się, że pakowałem kilka instrukcji SQL w transakcje, z których jedna była wykonywana na połączonym serwerze (instrukcja Merge w instrukcji EXEC (...) AT Server). Rozwiązałem ten problem, otwierając oddzielne połączenie z połączonym serwerem, zamykając to oświadczenie w try ... catch, a następnie przerywając transakcję na oryginalnym połączeniu w przypadku wyzwolenia pułapki.

aggaton
źródło
0

Miałem ten sam komunikat o błędzie. U mnie zmiana pooling=Falsena ;pooling=true;Max Pool Size=200w parametrach połączenia rozwiązała problem.

Niels Bijl
źródło
0

Miałem ten problem z połączonym serwerem w SSMS podczas próby utworzenia procedury składowanej.

Na serwerze połączonym zmieniłem opcję serwera „Włącz promocję w transakcjach rozproszonych” na Fałsz.

Zrzut ekranu opcji serwera

Zack Soderquist
źródło