Verwendung für IDbConnection / IDbTransaction sicher zu verwenden?

7

Während meine Annahme subjektiv zu klingen scheint, fand ich nach einigen Recherchen heraus, dass es nicht ungewöhnlich ist, Entwickler zu finden, die anstelle von Verwendung der Anweisung für die Verarbeitung von IDbConnection/IDbTransaction (Close / Commit / Rollback).

Dies gilt sogar für einige der erfahrensten Entwickler und einige neue. Ich werde absichtlich keine der Fragen zu StackOverflow- oder Forum-Links als Beispiel nennen, damit die Leute nicht beleidigt werden. Von was ich gefunden habe Verwenden der -Anweisung ist sicher zu verwenden (kein Wortspiel beabsichtigt).

Stimmt etwas nicht? Betrachten Sie den folgenden Code:

%Vor%

Angenommen, {CREATE_CONNECTION} ist Platzhalter für ein Sub , das je nach Datenbankanbieter eine Verbindung erstellt, die nach allen möglichen Best Practices geschrieben wurde und keine weiteren Verbesserungen benötigt.

Gibt es einen Grund, warum der obige Code nicht so geschrieben werden kann:

%Vor%

?

Klar, Version 2 ist intuitiver für das, was es tut. Aber vielleicht fehlt mir hier etwas Wichtiges? Dinge wie herstellerspezifische Implementierungen von Datenzugriffsbibliotheken, die nicht Transaction.Commit und / oder Connection.Close auf Dispose intern aufrufen? Wird dieser Ansatz in naher Zukunft stillgelegt oder in modernen Programmiermustern / Best Practices nicht als deutlich genug angesehen? Mono / mobile Apps Entwickler-Tools, die keine Debug-Unterstützung für Using keyword haben?

Ich suche nach irgendeiner Art von Antwort, um den Punkt zu unterstützen oder zu leugnen. Vorzugsweise die mit Anführungszeichen zur Originaldokumentation, etwa wie Do not use Using with IDbTransaction when ... . Links zu Blogs oder persönliche Erfahrungen sind ebenfalls in Ordnung.

    
Neolisk 03.06.2013, 18:22
quelle

2 Antworten

14

Ich bin ganz bei dir auf der Verbindung; das sollte using sein, und das explizite Close() ist nicht erforderlich. Die Transaktion ist ein wenig komplizierter; Der angezeigte Code ist im Moment sicherlich übertrieben, aber es ist nicht vollständig definiert, dass Dispose() einen Rollback durchführen sollte. Eigentlich ist das was in jeder Implementierung passiert, die ich mir angeschaut habe, aber es ist ein wenig ärgerlich, dass sogar DbTransaction (was die meisten Provider verwenden) dies nicht tut. Im Gegensatz zu TransactionScope , wo explizit definiert ist, dass ein Dispose() ohne ein Commit als Rollback gilt. Aus diesem Grund möchte ich verwenden (entschuldige die C #):

%Vor%

was in Bezug auf die Komplexität irgendwo zwischen den beiden liegt. Es wird zumindest nicht mit null -checks herumgespielt.

    
Marc Gravell 03.06.2013, 18:35
quelle
11

Was Sie sehen, sind Entwickler, die entsprechend der Dokumentation schreiben (ein "Gutes Ding"). Die Basisklasse DbTransaction (die für die Transaktionsimplementierungen der meisten Datenprovider verwendet wird) gibt eindeutig in ihrer Dokumentation an:

  

Dispose sollte die Transaktion zurücksetzen. Das Verhalten von Dispose ist jedoch Provider-spezifisch und sollte das Aufrufen von Rollback nicht ersetzen.

    
Michael Gunter 03.06.2013 18:36
quelle