2009-08-04 88 views
1

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

(更新) 将(nolock)添加到有问题的报告视图可以在短期内修复问题 - 从长远来看,我们必须复制数据以用快照或手动报告。 [叹气]我仍然想知道sql server 2008是如何使这成为必要的。

(update 2)由于有问题的视图仅用于报告“未读取”,因此现在应该可以。

回答

2

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

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

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

+0

*是*好文章。 Thx – 2009-08-05 01:36:15

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中做同样的事情,但是......你确定你的应用程序应该在未读取的情况下运行吗?您的应用专门用于处理数据移动和幻像读取吗?

1

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

+0

所以我们只是幸运? – 2009-08-04 20:46:02