ADO.NETおよびSQL Serverでネストされたトランザクションを有効にするにはどうすればよいですか?
-
27-09-2019 - |
質問
同様の質問があります 方法 小切手 トランザクションにいる場合. 。チェックする代わりに、ネストされたトランザクションを許可するにはどうすればよいですか?
ADO.NETでMicrosoft SQL Serverデータベースを使用しています。 T-SQLを使用した例を見て、トランザクション名を使用してトランザクションを使用してトランザクションを開始する例を見てきました。 connection.begintransactionを呼び出すとき、私は同じ接続で別の関数を呼び出します。それは再びbegintransactionを呼び出して、例外を与えます:
SqlConnection does not support parallel transactions.
多くのMicrosoftバリアントがこれを許可しているように見えますが、.mdfファイルでそれを行う方法を理解できません。
C#とado.netを使用して、Microsoft SQL Serverデータベースを使用してネストされたトランザクションを許可するにはどうすればよいですか?
解決
SQLサーバー全体は、ネストされたトランザクションをサポートしていません。 T-SQLでは、aを発行できます BEGIN TRAN
以前の内部 BEGIN TRAN
しかし、これは便利なためです。重要なのは外側のトランザクションだけです。 SQL Serverの.NETクライアント(SqlConnection
)試してみると、この例外をスローすることさえ許可しません。
他のヒント
SQL Serverがネストされたトランザクションをサポートしていることは一般的な誤解です。そうではありません。複数のトランザクションを開設してからCommitの呼び出しはまったく何もしません。テストSQLを簡単に書き込み、自分で試してみることができます。ネストされたトランザクションをエミュレートする唯一のオプションは、SavePointsを使用することです。
重要なのは、@@ tran_countがゼロに達するときだけで、外側のトランザクションのみがコミットされるポイントであることを付け加える必要があります。
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()));