代码之家  ›  专栏  ›  技术社区  ›  Booji Boy

SQL Server 2008读取阻止写入

  •  1
  • Booji Boy  · 技术社区  · 17 年前

    我已经将一组数据库从SQL Server 2000升级到了SQL Server 2008,现在大的读取操作正在阻止写入,而这在SQL Server 2000(相同的数据库和相同的应用程序和报表)中不是问题,为什么?2008年的环境有什么不同?2000年是否默认读取未提交的事务?

    (更新) 将with(nolock)添加到有问题的报表视图中可以在短期内解决问题-从长远来看,我们必须使用快照或手动复制用于报表的数据。[叹息]我还是想知道SQL Server 2008有什么必要这样做。

    (更新2)由于所讨论的视图仅用于报表,因此现在“read uncommited”应该是正常的。

    4 回复  |  直到 17 年前
        1
  •  2
  •   Thorarin    17 年前

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

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

    在没有更多信息的情况下,很难准确地说出正在发生的事情,但是要阅读锁类型并检查两个冲突查询的执行计划。这里有一个很好的地方 short article 这就解释了为什么事情会陷入僵局的另一个例子。

        2
  •  1
  •   Aaron Alton    17 年前

    read committed是SQL Server 2000中的默认隔离级别,而不是read uncommitted。

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

    我想象你的应用程序中有什么东西在设置隔离级别——可能是通过连接对象属性之一。看一看 here 用于通过ADO、ODBC和OLE DB设置事务隔离级别的方法。

    在SQL Server 2008中也可以这样做,但是……您确定您的应用程序应该在未提交的读取下运行吗?你的应用程序是专门为处理数据移动和幻象读取而设计的吗?

        3
  •  1
  •   Jon    17 年前

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

        4
  •  1
  •   Chris Chilvers    17 年前

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

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

    推荐文章