Frage

Ich habe eine ähnliche Frage wie wie man überprüfen Wenn Sie in einer Transaktion sind. Wie erlaube ich verschachtelte Transaktionen anstatt zu überprüfen?

Ich verwende die Microsoft SQL Server -Datenbank mit ado.net. Ich habe Beispiele mit T-SQL und Beispielen gesehen, mit denen Transaktionen mit Start und Verwendung von Transaktionsnamen starten. Wenn ich Connection.BeginTransaction aufruft, rufe ich eine andere Funktion in derselben Verbindung auf, und es ruft eine Starttransaktion erneut auf, was mir die Ausnahme gibt:

SqlConnection does not support parallel transactions.

Es scheint, dass viele Microsoft -Varianten dies erlauben, aber ich kann nicht herausfinden, wie es mit meiner .mdf -Datei geht.

Wie erlaube ich verschachtelte Transaktionen mit einer Microsoft SQL Server -Datenbank mit C# und ado.net?

War es hilfreich?

Lösung

SQL Server als Ganzes unterstützt keine verschachtelten Transaktionen. In T-SQL können Sie a ausgeben BEGIN TRAN in einem früheren BEGIN TRAN Aber das ist nur aus Bequemlichkeit. Es ist nur die äußere Transaktion, die zählt. Der .NET -Client für SQL Server (SqlConnection) erlaubt Ihnen nicht einmal, dies zu tun und wirft diese Ausnahme aus, wenn Sie es versuchen.

Andere Tipps

Es ist ein weit verbreitetes Missverständnis, dass SQL Server verschachtelte Transaktionen unterstützt. Es tut nicht. Das Öffnen mehrerer Transaktionen und dann das Aufrufen von Commit macht absolut nichts. Sie können leicht einige Tests SQL schreiben, um dies selbst zu versuchen. Die einzige Option hier, um eine verschachtelte Transaktion zu emulieren, besteht darin, SavePoints zu verwenden.

Ich sollte hinzufügen, dass das einzige, was zählt, ist, wenn @@ tran_count Null erreicht ist, ist der Punkt, an dem nur die äußere Transaktion begangen wird.

SqlConnection conn = new SqlConnection(@"Data Source=test;Initial Catalog=test;User ID=usr;Password=pass");
conn.Open();
var com = conn.CreateCommand();

com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO testTable (ParamName,ParamValue) values ('test','test');";
com.ExecuteNonQuery();
com.CommandText = "COMMIT TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "ROlLBACK TRANSACTION";
com.ExecuteNonQuery();

com.CommandText = "SELECT COUNT(*) FROM testTable ";

MessageBox.Show(string.Format("Found {0} rows.", com.ExecuteScalar()));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top