我已将一组数据库从sql server 2000升级到sql server 2008,现在大量读取阻塞写入,而这在sql server 2000中不是问题(相同的数据库和相同的应用程序和报告)为什么? 2008年的设置有何不同? 2000是否默认读取未提交的事务?
(更新) 在相关报告视图中添加(nolock)可以在短期内解决问题 - 从长远来看,我们必须使用快照或手动制作数据副本以进行报告。 [叹气]我还是想知道sql server 2008有什么必要。
(更新2)由于所讨论的视图仅用于报告“未读取”,因此现在应该可以。
答案 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)
您可以查看快照隔离,这将允许应用程序读取旧版本的行,而写入线程仍在忙于更新行。