我在asp.net 2.0上有一个很棒的Web应用程序。 在那里使用openre对象编辑器并进行一些更改。他们不能同时打开同一个对象。
按下“保存”后,所有更改过程都会通过回发保存在服务器上。
我正在使用交易进行保存。在保存操作正常之前,有很多程序,检查和其他操作。
using (SqlConnection con = .........)
{
SqlTransaction trans = null;
try
{
con.Open();
trans=con.BeginTransaction(IsolationLevel.ReadUncommitted);
........operations.........
trans.Commit();
}
catch (Exception e)
{
try { if (trans != null) trans.Rollback(); }
catch { }
throw new MyException("SQL Exception: " + e.Message, e);
}
finally
{
if (con != null && con.State == ConnectionState.Open) con.Close();
}
}
对我来说,这段代码非常安全。
但是周期性地发生: 这个Web应用程序在mssql上保存操作的一个进程变成了“休眠/等待”。 和其他用户调用的其他进程被此进程锁定并组织一个队列。
其中一人抛出超时.....但其他人正在等待。
所以,我的问题是:我的代码是否有一些错误的操作,允许命令进入睡眠/等待状态? 可能有一些技巧?
答案 0 :(得分:1)
由于您在事务中执行了大量操作,因此数据库锁可能会阻止您的应用程序。
您可以使用sp_who2存储过程(其中有更多详细信息here)通过检查结果的BlkBy列来查看服务器上是否有任何块。
您可能还想查看Sql Server locks和deadlocking
上的以下链接答案 1 :(得分:0)
但主要问题是第一个进程没有抛出超时异常。我们正在睡觉,因为我们不会杀死他。这是主要问题。
答案 2 :(得分:0)
Можетлиэтобытьсвязаносрепликацией。 Вмоменткогданаблюдаютсяописанныевышетормозарепликацияначинаетсильнотормозить。 Ипишет: 该过程无法连接到发布者'этабд'。 (来源:MSSQL_REPL,错误号:MSSQL_REPL20084) 获取帮助:http://help/MSSQL_REPL20084
·TCP提供商:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败。 (来源:MSSQLServer,错误号码:10060) 得到帮助: ·建立与服务器的连接时发生错误。连接到SQL Server 2005时,此错误可能是由于在默认设置下SQL Server不允许远程连接。 (来源:MSSQLServer,错误号码:10060) 得到帮助: ·登录超时已过期(来源:MSSQLServer,错误号:0) 得到帮助: ·合并过程无法执行查询,因为查询超时。如果此故障仍然存在,请增加该进程的查询超时。进行故障排除时,请使用详细历史记录日志记录重新启动同步,并指定要写入的输出文件。 (来源:MSSQLServer,错误号:0) 得到帮助: ЭтаБДявляетсяисточникомрепликации。