Chciałbym uruchomić wiele instrukcji wstawiania na wielu tabelach. Używam dapper.net. Nie widzę sposobu obsługi transakcji z dapper.net.
Podziel się swoimi pomysłami na wykorzystanie transakcji w dapper.net.
c#
transactions
dapper
Amit
źródło
źródło
Dispose()
metodą. JeśliComplete()
nie został wywołany, transakcja zostanie wycofana.TransctionScope
bloku using w przypadku wybrania tej odpowiedzi.Wolałem zastosować bardziej intuicyjne podejście, pobierając transakcję bezpośrednio z połączenia:
źródło
.BeginTransaction()
go? Gdyby tak było, ta metoda rozszerzenia promowałaby niewłaściwe wykorzystanie transakcji. (IMO, powinno nawet wyrzucić „nie można otworzyć transakcji po tym, jak połączenie jest już otwarte”.)Execute
, ponieważ jest to wymagane.Powinieneś móc używać,
TransactionScope
ponieważ Dapper uruchamia tylko polecenia ADO.NET.źródło
Biorąc pod uwagę, że wszystkie twoje tabele znajdują się w jednej bazie danych, nie zgadzam się z
TransactionScope
rozwiązaniem sugerowanym w niektórych odpowiedziach tutaj. Skorzystaj z tej odpowiedzi.TransactionScope
jest zwykle używany do transakcji rozproszonych; transakcja obejmująca różne bazy danych może znajdować się w innym systemie. Wymaga to pewnych konfiguracji w systemie operacyjnym i SQL Server, bez których to nie zadziała. Nie jest to zalecane, jeśli wszystkie zapytania dotyczą jednej instancji bazy danych.Ale w przypadku jednej bazy danych może to być przydatne, gdy musisz uwzględnić kod w transakcji, nad którym nie masz kontroli. W przypadku pojedynczej bazy danych nie wymaga również specjalnych konfiguracji.
connection.BeginTransaction
to składnia ADO.NET do implementacji transakcji (w C #, VB.NET itp.) w pojedynczej bazie danych. Nie działa to w przypadku wielu baz danych.Więc
connection.BeginTransaction()
jest lepszym sposobem.Jeszcze lepszym sposobem obsługi transakcji jest wdrożenie UnitOfWork, jak wyjaśniono w tej odpowiedzi.
źródło
TransactionScope
co jest nieefektywne dla tego, czego chce PO. Zgadzam się, żeTransactionScope
to dobre narzędzie w wielu przypadkach; ale nie to.Odpowiedź Daniela zadziałała dla mnie zgodnie z oczekiwaniami. Dla kompletności, oto fragment, który demonstruje zatwierdzanie i wycofywanie przy użyciu zakresu transakcji i dapper:
źródło
Dispose
metoda jest wywoływana jako pierwsza czy druga, tylko że jest wywoływana dwukrotnie. Co do tego, że „wezwanie do pozbycia się po raz drugi nie jest szkodliwe”, to duże założenie. Dowiedziałem się, że dokumenty i rzeczywiste implementacje często nie są zgodne. Ale jeśli chcesz na to słowo Microsoftu: msdn.microsoft.com/en-us/library/ ...