Wo vollständige TransactionScope-in-using-Anweisungen?
Bin ich mit zwei SQLConnection in ein TransactionScope-ist dieser (pseudo -) code korrigieren?
using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
{
(...)
}
using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
{
(...)
}
ts.Complete();
}
oder sollte ich diese benutzen?
using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
{
(...)
using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
{
(...)
ts.Complete();
}
}
}
Der erste code ist schöner als es mir erlaubt, zu extrahieren wird der Befehl in den Methoden. Aber meine Befürchtung ist, dass in diesem Fall die verbindungen entsorgt werden, bevor die Fertigstellung des Geltungsbereichs, ist die Eintragung in die TransactionScope-genug, um dies zu verhindern?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist überhaupt kein problem aufrufen
Complete
nach dem nested-verbindungen angeordnet sind. Die Lebensdauer der Transaktion ist absichtlich größer als die von der SQL-Verbindung, und Sie können weiterhin mit ihm zu interagieren, unabhängig von der Lebensdauer der anderen verbindungen.Also ja, in deinem ersten Beispiel, die Sie anrufen
Complete
nach dem Anschluss angeordnet ist, und das ist völlig in Ordnung.Können Sie sehen, basierend auf den Beispielen in der Dokumentation für Transaktionsbereich sowie diese Seite auf wie zu verwenden transaktionsbereichen, dass die Transaktion kann abgeschlossen werden, nachdem die Verbindung aufgebaut wurde entsorgt.
In deinem ersten Beispiel, die beiden Anschlüsse sind entsorgt, bevor ts.Vollständige() genannt wird, ist das kein problem, da der ts.Vollständige () - Methode nicht verwenden, verbindungen:
In Ihrem zweiten Beispiel, der ts.Vollständige () - Methode wird aufgerufen, wenn die beiden Anschlüsse sind noch am Leben, jedoch sind Sie nicht an die Methode übergeben und können daher nicht verwendet werden.
Dies bedeutet, dass beide Methoden funktionieren gleich gut und es ist unerheblich, ob oder nicht die verbindungen entsorgt werden, bevor ts.Vollständige() aufgerufen wird.
If you need to call ts.Complete() before the connections are disposed of
Und was macht Sie denken, dass getan werden muss? Ich sehe keine Anzeichen dafür, dass es getan werden muss.However my fear is that in this case the connections are disposed before the completion of the scope
.using
- Anweisung. Warum gehst du nicht zusammen mit Ihrer eigenen Antwort dann.If you need to call [...]
gut, da Sie nicht, brauchen Sie nicht zu tun den rest. Nichts ist falsch, es gerade nicht wirklich sagen, überhaupt nichts.Suchen Sie auf der MSDN-Website sieht es aus wie die zweite ist diejenige, die...
http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx (siehe das erste Beispiel)
Complete
nach dem Ende derusing
block für die Anschlüsse, also ist es eigentlich nach dem ersten Beispiel, nicht die zweite.Gibt es eine Dritte Möglichkeit: