7

取引中であるかどうかを確認する方法と同様の質問があります。チェックする代わりに、ネストされたトランザクションを許可するにはどうすればよいですか?

ADO.NETでMicrosoftSQLServerデータベースを使用しています。T-SQLを使用した例と、beginを使用してトランザクション名を使用してトランザクションを開始する例を見てきました。connection.BeginTransactionを呼び出すときに、同じ接続で別の関数を呼び出すと、BeginTransactionが再度呼び出され、例外が発生します。

SqlConnection does not support parallel transactions.

多くのMicrosoftの亜種がこれを許可しているようですが、.mdfファイルでそれを行う方法がわかりません。

C#とADO.NETを使用してMicrosoft SQL Serverデータベースでネストされたトランザクションを許可するにはどうすればよいですか?

4

3 に答える 3

8

SQL Server 全体では、ネストされたトランザクションはサポートされていません。T-SQL ではBEGIN TRAN、以前に insideを発行できますBEGIN TRANが、これは便宜上のものです。重要なのは外側のトランザクションだけです。SQL Server 用の .NET クライアント ( SqlConnection) では、これを行うことさえできず、試行するとこの例外がスローされます。

于 2010-05-18T20:28:52.743 に答える
4

SQL Server が入れ子になったトランザクションをサポートしているというのはよくある誤解です。そうではありません。複数のトランザクションを開いてコミットを呼び出しても、まったく何も起こりません。テスト SQL を簡単に記述して、これを自分で試すことができます。ネストされたトランザクションをエミュレートする唯一のオプションは、セーブポイントを使用することです。

唯一重要なのは、@@TRAN_COUNT がゼロに達した時点で、外側のトランザクションのみがコミットされるということです。

于 2012-12-07T17:21:04.993 に答える
0
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()));
于 2012-06-08T06:30:34.847 に答える