Jakie są najlepsze praktyki wykonywania transakcji w C # .Net 2.0. Jakie klasy powinny być używane? Jakie są pułapki, na które należy zwrócić uwagę itp. Wszystkie te rzeczy dotyczące zatwierdzania i wycofywania. Właśnie zaczynam projekt, w którym może być konieczne wykonanie pewnych transakcji podczas wstawiania danych do bazy danych. Wszelkie odpowiedzi lub linki nawet do podstawowych informacji na temat transakcji są mile widziane.
c#
.net
transactions
Malik Daud Ahmad Khokhar
źródło
źródło
Odpowiedzi:
Istnieją 2 główne rodzaje transakcji; transakcje połączeń i transakcje otoczenia. Transakcja połączenia (taka jak SqlTransaction) jest powiązana bezpośrednio z połączeniem db (takim jak SqlConnection), co oznacza, że musisz nadal przekazywać połączenie - w niektórych przypadkach OK, ale nie pozwala na „tworzenie / używanie / zwalnianie” użycia i nie zezwala na pracę między bazami danych. Przykład (sformatowany dla spacji):
Nie jest zbyt niechlujny, ale ogranicza się do naszego połączenia "Conn". Jeśli chcemy odwołać się do różnych metod, musimy teraz przekazać „conn”.
Alternatywą jest transakcja otoczenia; Nowość w .NET 2.0, obiekt TransactionScope (System.Transactions.dll) umożliwia korzystanie z szeregu operacji (odpowiedni dostawcy będą automatycznie rejestrować się w transakcjach otoczenia). Ułatwia to retro dopasowanie do istniejącego (nietransakcyjnego) kodu i rozmowę z wieloma dostawcami (chociaż DTC zaangażuje się, jeśli porozmawiasz z więcej niż jednym).
Na przykład:
Zauważ tutaj, że te dwie metody mogą obsługiwać własne połączenia (otwórz / użyj / zamknij / usuń), ale po cichu staną się częścią transakcji otoczenia bez konieczności przekazywania czegokolwiek.
Jeśli twój kod zawiera błędy, Dispose () zostanie wywołana bez Complete (), więc zostanie wycofana. Obsługiwane jest oczekiwane zagnieżdżanie itp., Chociaż nie można cofnąć transakcji wewnętrznej, ale zakończyć transakcję zewnętrzną: jeśli ktoś jest niezadowolony, transakcja jest przerywana.
Inną zaletą TransactionScope jest to, że nie jest on powiązany tylko z bazami danych; każdy dostawca obsługujący transakcje może z niego korzystać. Na przykład WCF. Lub istnieją nawet modele obiektów kompatybilne z TransactionScope (np. Klasy .NET z możliwością wycofania - być może łatwiejsze niż pamiątka, chociaż sam nigdy nie korzystałem z tego podejścia).
W sumie bardzo, bardzo przydatny obiekt.
Kilka zastrzeżeń:
źródło
źródło
Możesz również zawrzeć transakcję we własnej procedurze składowanej i obsłużyć ją w ten sposób, zamiast wykonywać transakcje w samym C #.
źródło
jeśli potrzebujesz go tylko do rzeczy związanych z db, niektóre OR Mappers (np. NHibernate) domyślnie obsługują transactinos po wyjęciu z pudełka.
źródło
Zależy to również od tego, czego potrzebujesz. W przypadku podstawowych transakcji SQL możesz spróbować wykonać transakcje TSQL, używając w swoim kodzie BEGIN TRANS i COMMIT TRANS. To najłatwiejszy sposób, ale ma złożoność i musisz uważać, aby poprawnie zatwierdzić (i wycofać).
Użyłbym czegoś takiego
Jakakolwiek awaria wyskoczy Cię bezpośrednio z
using
transakcji, a transakcja zawsze zostanie zatwierdzona lub wycofana (w zależności od tego, co jej powiesz). Największym problemem, z jakim mieliśmy do czynienia, było upewnienie się, że zawsze się to zgadza. Zastosowanie zapewnia ograniczenie zakresu transakcji.źródło