/ / Czy konieczne jest wycofanie jawnej transakcji? - c #, sql, baza danych, ado.net, transakcje

Czy konieczne jest jednoznaczne wycofywanie transakcji? - c #, sql, database, ado.net, transakcje

Wiele przykładów opowiada się za wyraźnym wycofaniem transakcji z bazy danych, zgodnie z następującymi zasadami:

using (var transaction = ...)
{
try
{
// do some reading and/or writing here

transaction.Commit();
}
catch (SqlException ex)
{
// explicit rollback
transaction.Rollback();
}
}

Jednak zazwyczaj robię to:

using (var transaction = ...)
{
// do some reading and/or writing here

transaction.Commit();
}

Kiedy pojawia się wyjątek, polegam tylko na domniemanym wycofywaniu transakcji, które nie zostały popełnione.

Czy istnieje problem polegający na tym niejawnym zachowaniu? Czy ktoś ma przekonujący powód, dla którego nie powinienem robić tego w ten sposób?

Odpowiedzi:

13 dla odpowiedzi nr 1

Nie, nie jest to specjalnie potrzebne, ale mogę wymyślić 2 powody, dla których może to być dobry pomysł:

  • Przejrzystość

Niektórzy mogą twierdzić, że za pomocą transaction.Rollback() wyjaśnia, w jakich okolicznościach transakcja nie zostanie popełniona.

  • Zwolnienie blokad

W przypadku transakcji ważne jest, aby pamiętać, że niektóre blokady zostaną zwolnione dopiero po wycofaniu lub zatwierdzeniu transakcji. Jeśli korzystasz z using instrukcja, wówczas transakcja zostanie wycofana, gdy transakcja zostanie sprzedana, jednak jeśli z jakiegoś powodu trzeba wykonać obsługę błędów w using blokowanie, może być korzystne wycofanie transakcji (usunięcie blokad) przed wykonaniem złożonej / czasochłonnej obsługi błędów.


3 dla odpowiedzi № 2

Widzę dwa problemy z twoim użyciem:

  1. „Polegasz na transakcji Dispose ()metoda wycofania niezaangażowanej transakcji, powodująca zależność od implementacji IDisposable przez firmę zewnętrzną. W tym przypadku jest to znikome ryzyko, ale nie jest to dobra praktyka.
  2. Brakuje Ci możliwości zalogowania się i / lub obsługi wyjątku. Również złapałbym wyjątek, a nie SqlException.

1 dla odpowiedzi nr 3

Myślę, że można na to odpowiedzieć jako pierwszypodejście jest bardziej czytelne dla kogoś, kto utrzymuje Twój kod. Wyraźny charakter kodowania sprawia, że ​​cele są jasne i szybkie. Chociaż niejawne wycofanie jest dla Ciebie jasne i prawdopodobnie każdy, kto ma więcej niż wiedzę na temat obsługi transakcji, może nie być dla innych. To powiedziawszy, kilka komentarzy szybko to naprawi. Jedynym problemem jest to, że niejawne wycofanie nie jest udokumentowaną funkcją obiektu.

Tak więc, powiedziałbym, pod warunkiem, że skomentujesz operację i będziesz mógł polegać na działaniach niejawnych, to nie ma dobrego powodu, aby wybierać wyraźne podejście.


1 dla odpowiedzi nr 4

Najbardziej poprawnie napisane połączenie ADO.NET spowoduje wycofanie transakcji, które nie zostały wyraźnie zatwierdzone. Więc nie jest to absolutnie konieczne.

Główną zaletą, którą widzę wyraźnie Rollback() nazwij to możliwością ustawienia punktu przerwania inastępnie sprawdź połączenie lub bazę danych, aby zobaczyć, co się dzieje. Dla przyszłych opiekunów kodu jest również bardziej zrozumiałe, co dzieje się pod różnymi ścieżkami wykonywania.


0 dla odpowiedzi № 5

Tak długo, jak transakcja jest całkowiciesamowystarczalny w bloku using (), możesz zacząć. Problemy mogą jednak powstać, jeśli ktoś, jeśli zostanie przekazany istniejący obiekt transakcji od osoby dzwoniącej. Ale to inny scenariusz ...