sql server 2008读取阻塞写入

时间:2009-08-04 17:49:12

标签: sql sql-server-2008

我已将一组数据库从sql server 2000升级到sql server 2008,现在大量读取阻塞写入,而这在sql server 2000中不是问题(相同的数据库和相同的应用程序和报告)为什么? 2008年的设置有何不同? 2000是否默认读取未提交的事务?

(更新) 在相关报告视图中添加(nolock)可以在短期内解决问题 - 从长远来看,我们必须使用快照或手动制作数据副本以进行报告。 [叹气]我还是想知道sql server 2008有什么必要。

(更新2)由于所讨论的视图仅用于报告“未读取”,因此现在应该可以。

4 个答案:

答案 0 :(得分:2)

默认情况下,SQL Server 2000没有使用READ UNCOMMITTED,没有。

它可能与执行计划中的优化更改有关。某些索引可能会以与SQL Server 2000中不同的顺序锁定。或者SQL Server 2008正在使用SQL Server 2000完全忽略该索引的索引。

如果没有更多信息,很难确切地说出发生了什么,但是请阅读锁定类型并检查两个冲突查询的执行计划。这是一个很好的short article,它解释了为什么事情会陷入僵局的另一个例子。

答案 1 :(得分:1)

Read Committed是SQL Server 2000中的默认隔离级别,而不是Read Uncommitted。

http://msdn.microsoft.com/en-us/library/aa259216(SQL.80).aspx

我想你的应用程序中的某些东西正在设置隔离级别 - 可能是通过其中一个连接对象属性。查看用于通过ADO,ODBC和OLE DB设置事务隔离级别的方法的here

您可以在SQL Server 2008中执行相同的操作,但是......您确定应用程序应该在未提交的读取下运行吗?您的应用是专门设计用于处理数据移动和幻像读取吗?

答案 2 :(得分:1)

我真的很惊讶你没有在SQL Server 2000中遇到问题。似乎每周我们都在修复锁定表的存储过程,因为有人忘记了nolocks。

答案 3 :(得分:1)

您可以查看快照隔离,这将允许应用程序读取旧版本的行,而写入线程仍在忙于更新行。

http://msdn.microsoft.com/en-us/library/ms189050.aspx