【问题标题】:Debugging a database deadlock调试数据库死锁
【发布时间】:2012-09-17 21:07:49
【问题描述】:

我正在尝试使用带有 SQL Server 2000 数据库的经典 ASP 编写的站点来解决问题。

网站似乎每隔几天就会出现故障。当您尝试访问该网站时,该网站没有任何响应。浏览器中的加载指示器会旋转,页面只是保持空白。

当我在站点关闭后运行 sp_who2 时,总是有一个进程占用了大量的 CPU 时间。此进程将阻塞数据库中的所有其他进程。

我可以通过终止此进程使网站再次运行。

我不知道发生了什么。当我查看该进程在锁定之前运行的存储过程时,它没有任何问题。运行此存储过程的页面将关闭所有连接对象。

关于什么可能导致这种死锁,或者我可以如何阻止它发生的任何想法?

【问题讨论】:

  • 也许说的很明显……你确定开发者一直都关闭了所有的连接对象吗?
  • 是的,刚查了一下网站,连接对象在页面底部关闭了。
  • 这已经让人放心了.. 只有一个页面?你确定总是到达页面的末尾吗? (例如中间没有response.redirect,不关闭记录集和连接的错误处理等)
  • 今天网站宕机时,我查看了网站崩溃前最后运行的查询是什么。这是一个只出现在我们的注册页面上的存储过程,所以我认为它只是导致这些问题的那个页面,但我不知道。该页面上有几个地方有重定向,所以我更改了页面,以便在此之前关闭连接。我还没来得及检查整个网站。
  • 希望对您有所帮助...同时,我将使用我们过去使用的 vbscript 程序发布答案,以确保我们关闭 all 记录集和连接。

标签: asp-classic vbscript sql-server-2000


【解决方案1】:

不确定这是否是问题所在,但可能并非所有记录集和连接都始终关闭......当我们过去遇到类似问题时,我们最终得到了以下例程......(请注意这只是一个显示一个记录集关闭的 sn-p,实际过程实际上会遍历 15 个不同的记录集以查看它们是否需要关闭..)。

modCloseObjects() 过程总是在页面末尾、重定向之前、内部错误处理等时调用...

' subroutine will close and set the objects to Nothing. '
' Close Recordsets and then the Connection '
sub modCloseObjects()

    'Close the record sets one by one '
    If ucase(TypeName(oRS)) = "RECORDSET" then
        if oRS.state <> adStateClosed then
            oRS.close
            Set oRS = Nothing
         end if
    end if

    ' if you have other recordSet objects, add them to the rourtine here: '


    ' Close the connection '

    If ucase(TypeName(objConn)) = "CONNECTION" then
        if objConn.state <> adStateClosed then
             objConn.close
             Set objConn = Nothing
        end if
    end if

end sub

如果您没有 adovbs.inc ,您还需要以下常量:

Const adStateClosed = &H00000000

【讨论】:

  • 谢谢。我已将此代码添加到站点并确保所有连接都已关闭。如果网站在下个月左右没有关闭,我会回来接受这个答案。
  • OP 会发货的,请继续等待!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多