是否可以使用只读访问创建死锁?

Dan*_*ski 8 sql-server rdbms deadlock ado

我有一个VB6应用程序通过ADO访问MSSQL2000服务器上的单个表.我正在使用只读访问权限(adOpenStatic,adLockReadOnly)网络中还有其他应用程序可以对表进行更改.

出于某种原因,我收到的错误是我的应用程序被选为死锁受害者.

我真的很困惑:当我从一张桌子上读书时为什么会出现僵局?我期待超时,因为其他应用程序的编写,但不是死锁......

有人可以对此有所了解吗?

更新:2009-06-15我仍然对这个问题的解决方案感兴趣.所以我提供了更多信息:

  • 如果我选择adOpenForwardOnly或adOpenStatic,则没有任何区别
  • 如果光标位置是客户端或服务器,则没有区别.

Jus*_*tin 13

由于存在非聚集索引,单个SELECT语句可能会针对单个UPDATE或DELETE语句进行死锁,请考虑以下情况:

读者(您的应用程序)首先获取非聚集索引上的共享锁以执行查找,然后尝试在页面上获取共享锁,以便返回数据本身.

编写器(其他应用程序)首先在包含数据的数据库页面上获得一个exlusive锁,然后尝试获取索引的独占锁以更新索引.

您可以在Microsoft知识库文章Q169960(http://support.microsoft.com/kb/q169960/)中找到有关此(和其他)类型的死锁的更多信息.

此外,您可能希望了解一下如何获取死锁跟踪信息(跟踪标志1222) - 这将报告发生死锁时究竟哪些SQL语句与哪些对象发生冲突.这是一篇相当不错的文章 - http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx