睡觉等待命令阻止其他交易

时间:2010-12-06 12:44:03

标签: asp.net sql-server transactions locking sleep

我在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上保存操作的一个进程变成了“休眠/等待”。 和其他用户调用的其他进程被此进程锁定并组织一个队列。

其中一人抛出超时.....但其他人正在等待。

所以,我的问题是:我的代码是否有一些错误的操作,允许命令进入睡眠/等待状态? 可能有一些技巧?

3 个答案:

答案 0 :(得分:1)

由于您在事务中执行了大量操作,因此数据库锁可能会阻止您的应用程序。

您可以使用sp_who2存储过程(其中有更多详细信息here)通过检查结果的BlkBy列来查看服务器上是否有任何块。

您可能还想查看Sql Server locksdeadlocking

上的以下链接

答案 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) 得到帮助: ЭтаБДявляетсяисточникомрепликации。