目标:限制在 Asp.Net 网页上启动的 Sql Server 事务的持续时间。
一个事务不仅仅是一个命令,所以 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 命令正在运行,那么这还不够好。这一切都是为了保护所有其他用户免受一个人过于繁重的工作。然后那个人需要重新考虑他的工作的大小,把它分成更小的块。
在 Asp.Net 中,我查看了 ExecutionTimeout、ScriptTimeout、CommandTimeout。在 Sql Server 中,我查看了 QUERY_GOVERNOR_COST_LIMIT 和 LOCK_TIMEOUT。
这些似乎都没有达到目标。
有任何想法吗?