在生产SQL Server 2000数据库中,我们遇到了一些非常烦人的死锁情况。SQL Server 2000死锁
主要设置如下:
- SQL Server 2000企业版。
- 服务器使用ATL OLE数据库以C++编码。
- 通过存储过程访问所有数据库对象。
- 所有UPDATE/INSERT存储过程都将其内部操作包装在BEGIN TRANS ... COMMIT TRANS块中。
我收集与SQL事件探查继互联网就像this one上几篇文章了一些初步的痕迹(忽略它指的是SQL Server 2005和的工具,同样的原则也适用)。 从跟踪看来,它是两个UPDATE查询之间的死锁。
我们已经采取可能从作为发生降低问题的可能性了一些措施:
- 选择带(NOLOCK)。我们更改了存储过程中的所有SELECT查询以使用WITH(NOLOCK)。我们理解具有脏读取的含义,但被查询的数据并不重要,因为我们会进行大量自动刷新,并且在正常情况下,UI将具有正确的值。
- READ UNCOMMITTED。我们已将服务器代码上的事务隔离级别更改为READ UNCOMMITED。
- 交易范围缩小。我们减少了交易的时间,以尽量减少发生数据库死锁的可能性。
我们也在质疑我们在大多数存储过程(BEGIN TRANS ... COMMIT TRANS块)内部有一个事务。在这种情况下,我猜测事务隔离级别是SERIALIZABLE,对吗?那么如果我们在调用存储过程的源代码中指定了事务隔离级别(如果我们也有),哪一个适用?
这是一个处理密集型应用程序,我们正在为读取(更大的百分比)和一些写入命中数据库。
如果这是一个SQL Server 2005数据库,我可以用Geoff Dalgas answer on an deadlock issue concerning Stack Overflow,如果这甚至适用于我遇到的问题。但是,升级到SQL Server 2005目前还不是一个可行的选择。我的问题是:你会怎么走?您会采取哪些步骤来减少甚至避免发生死锁,或者我应该使用哪些命令/工具来更好地揭示问题?
它看起来像只是影响了一些时间,巧合得到了减少相同死锁的机会。 – 2009-11-27 20:31:43