レポート モジュールの一部として、実行時間の長い SQL クエリをいくつか実行しています。これらのクエリは、実行時に動的に構築されます。ユーザーの入力に応じて、それらは単一ステートメントまたは複数ステートメントであり、1 つ以上のパラメーターを持ち、1 つ以上のデータベース テーブルで動作します。つまり、それらの形式は簡単には予測できません。
現在、これらのステートメントを通常の で実行しているだけですSqlConnection
。
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
これらのクエリ (実際にはクエリ バッチ) は実行に時間がかかることがあるため、テーブルのロックが他のユーザーの読み取り/書き込みを妨げていることを懸念しています。これらのレポートのデータがバッチの実行中に変更されても問題ありません。レポート クエリは、それらのテーブルに対する他の操作よりも優先されるべきではなく、テーブルをロックするべきでもありません。
データの変更を伴うほとんどの長時間実行/複数ステートメントの操作では、トランザクションを使用します。ここでの違いは、これらのレポート クエリがデータを変更しないことです。SqlTransaction
分離レベルを制御するために、これらのレポート クエリを でラップするのは正しいでしょうか?
すなわち:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
これは私の望む結果を達成しますか?データが変更されていない場合でも、トランザクションをコミットすることは正しいですか? 別のアプローチはありますか?