【问题标题】:sleeping awaiting command blocks other transactions睡眠等待命令阻塞其他事务
【发布时间】:2010-12-06 12:44:03
【问题描述】:

我在 asp.net 2.0 上有一个大型 Web 应用程序。 用户在那里打开对象编辑器并进行一些更改。他们不能同时打开同一个对象。

在他们按下“保存”按钮后,所有更改过程都会通过回发保存在服务器上。

我正在使用事务进行保存。保存操作OK前还有很多程序、检查等。

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

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

所以,我的问题是:我的代码是否有一些错误操作导致命令进入休眠/等待状态? 会不会有什么技巧?

【问题讨论】:

  • 你显然省略了代码来缩短你的代码示例,所以可能是因为这个,但我在你的代码中的任何地方都没有看到 trans.Commit() 调用?
  • try { if (trans != null) trans.Rollback(); }后面的空catch块的作用是什么。想知道这是否掩盖了一些错误。

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


【解决方案1】:

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

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

您可能还想查看Sql Server locksdeadlocking 上的以下链接

【讨论】:

  • 是的,有很多数据库操作。数据库负载很大。但是为什么这个命令存在于数据库中。如果 DB wii 锁定我的命令,应用程序会抛出异常并且事务将被回滚。它可能会发生,但这个命令仍然存在,其他人正在等待它。
  • 锁不会引发异常,除非您在执行事务的命令上设置了超时,否则会出现超时异常。尝试使用 sp_who2 存储过程来查看您的数据库中是否确实存在相互阻塞的进程。
  • 我已经破解了最后一个案例 - 没有死锁。第一个命令正在休眠/等待,第二个命令被 1-st 锁定,3-rd - 2-nd .........等等
  • 杀死 1 号进程(使用 kill 命令)是否会释放所有其他进程并使页面加载?
  • 我没有时间测试这个案例?所以我们为特殊用户和应用程序设置了一个杀死此类命令的作业。还有其他建议吗?
【解决方案2】:

Может ли это быть связано с репликацией。 В момент когда наблюдаются описанные выше тормоза репликация начинает сильно тормозить。 Ипишет: 该进程无法连接到发布者“эта бд”。 (来源:MSSQL_REPL,错误号:MSSQL_REPL20084) 获取帮助:http://help/MSSQL_REPL20084

· TCP Provider:连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。 (来源:MSSQLServer,错误号:10060) 得到帮助: · 建立与服务器的连接时发生错误。连接到 SQL Server 2005 时,此故障可能是由于在默认设置下 SQL Server 不允许远程连接造成的。 (来源:MSSQLServer,错误号:10060) 得到帮助: · 登录超时过期(来源:MSSQLServer,错误号:0) 得到帮助: · 合并进程未能执行查询,因为查询超时。如果此故障继续存在,请增加该进程的查询超时。进行故障排除时,使用详细历史记录重新启动同步并指定要写入的输出文件。 (来源:MSSQLServer,错误号:0) 得到帮助: Эта БД является источником репликации。

【讨论】:

    【解决方案3】:

    但主要问题是第一个进程没有抛出超时异常。它像木头一样睡觉,因为我们没有杀死他。这是主要问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多