2009-04-22 5 views
7

Dies steht im Zusammenhang mit der Nested Database transactions in C#.Kann ich SqlConnection.BeginTransaction und TransactionScope mischen?

Die Objekte in der Sammlung, die ich in der Transaktion übernehmen möchte, implementieren ihre eigenen Transaktionen mit der Methode SqlConnection.BeginTransaction.

Nach dem Lesen dieser post bin ich nicht sicher, ob ich diese auch mischen kann oder nicht. Ich verwende SQL Server 2005 und jedes Objekt verwendet Verbindungsdetails aus der statischen Konfigurationsklasse.

Hat jemand Erfahrung damit?

Hier ist der Beispielcode ist:

using(TransactionScope scope = new TransactionScope()) 
{ 
    for (int i=0; i<=1000....) 
    { 
    SqlConnection con = new SqlConnection() 
    SqlCommand cmd = new SqlCommand("delete from ...", con); 

    try { 
     con.Open(); 
     DbTransaction t = con.BeginTransaction(); 
     cmd.ExecuteNonQuery(); 
     ... 
     cmd.CommandText = .... ; 
     cmd.ExecuteNonQuery(); 
     t.Commit ... 
    } 
    catch { 
     t.Rollback ... 
    } 
    con.Close() 
    } 
} 

Thx

Antwort

5

Nach Stunden verbringen MSDTC konfigurieren auf beiden Maschinen zu arbeiten, habe ich endlich zu dem Punkt, wo ich den Code testen konnte.

It (mit 1-Datenbank)

Das obige Problem kann sehr nützlich sein, um Menschen zu arbeiten scheint, die den Zugriff auf den Quellcode nicht so loszuwerden „Legacy“ Transaktionssystem oder wenn Transaktionen haben nicht Teile des Codes sind nicht lokalisiert oder, wie in meinem Fall, möchten Sie nicht zu viel mit dem komplexen Code, der sich in der Produktionsumgebung bewährt hat, aber verschachtelte Transaktionen einführen müssen ...

Lass es mich wissen, wenn du andere Erfahrungen hast.

+0

Sie sollten Ihre Antwort als Antwort auf diese Frage markieren - es ist erlaubt! – Fenton

+1

In meinem Fall haben wir "Unit" -Tests, die in TransactionScope verpackt sind, so dass wir auf unseren Entwicklungsmaschinen komplexe Datenbankmanipulationen durchführen können, ohne für jede Test- und Testklasse darüber nachzudenken und alles [theoretisch] rückgängig zu machen. Zur gleichen Zeit möchten wir nicht unbedingt MS DTC-Nutzung auf den Produktionsservern, und ich wollte ein paar gemeinsame Entity Framework-Manipulationen in einer regulären Transaktion wickeln, so dass die gesamte Operation Rollback kann, wenn einer davon fehlschlägt ... Im Idealfall sollte das TransactionScope weiterhin funktionieren und die innere Transaktion sollte auch ... – bambams