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?
asp.net
vb.net
transactionscope
Lajos Arpad
źródło
źródło
Odpowiedzi:
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
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.
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.
W menu Akcja kliknij opcję Właściwości.
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.
źródło
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.
źródło
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
źródło
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. } }
źródło
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.
źródło
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:
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.
źródło
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
źródło
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.
źródło
Miałem ten sam komunikat o błędzie. U mnie zmiana
pooling=False
na;pooling=true;Max Pool Size=200
w parametrach połączenia rozwiązała problem.źródło
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
źródło