目標:Asp.NetWebページで開始されたSQLServerトランザクションの期間を制限すること。
トランザクションは複数のコマンドであるため、SqlCommand.CommandTimeoutは十分に強力ではありません。
シナリオ:Asp.Netページは次のようなことをします:
SqlConnection connection = new SqlConnection("yourserver");
connection.Open();
tran1 = connection.BeginTransaction();
command.Transaction = tran1;
command.CommandText = "select lots of stuff";
command.ExecuteScalar()
command.CommandText = "select some more stuff";
command.ExecuteScalar()
command.CommandText = "update some stuff";
command.ExecuteScalar()
tran1.Commit();
connection.Close();
すべての作業に時間がかかりすぎて、途中でリソースがロックされる場合は、SQL Server自体またはAsp.Netのいずれかによって、どこにいてもそのトランザクションを中止する必要があります。また、それを開始したクライアントマシンがウィンドウから外れた場合。
Asp.Netが実行を中止しても、トランザクションを開いたままにするか、SQLコマンドを実行している場合は、それだけでは不十分です。それは、他のすべてのユーザーを1人の個人による過度の作業から保護することです。その個人はそれから彼の仕事のサイズを再考し、それをより小さな塊に分割する必要があります。
Asp.Netでは、ExecutionTimeout、ScriptTimeout、CommandTimeoutを見てきました。SQL Serverでは、QUERY_GOVERNOR_COST_LIMITとLOCK_TIMEOUTを確認しました。
これらのどれも目標を達成していないようです。
何か案は?