什么是SQL Server中的“(nolock)”?

有人可以解释使用with (nolock)查询时的含义,何时应该/不应该使用它?

例如,如果您的银行应用程序具有高交易率和某些表中的大量数据,那么在什么类型的查询中,nolock会好起来? 是否有这种情况,您应该始终使用它/从不使用它?


WITH(NOLOCK)相当于使用READ UNCOMMITED作为事务隔离级别。 因此,您将面临读取后续回滚的未提交行的风险,即从未将数据写入数据库的数据。 因此,虽然它可以防止读取被其他操作僵持,但它带来了风险。 在一个高交易率的银行应用程序,它可能不会是正确的解决方案,你想解决的任何问题,恕我直言。


问题是更糟糕的是:

  • 一个僵局,或者
  • 错误的价值?
  • 对于金融数据库来说,死锁远比错误的值更糟。 我知道这听起来倒退了,但听我说。 数据库事务的传统示例是更新两行,从一个中减去并添加到另一个中。 那是错的。

    在您使用商业交易的金融数据库中。 这意味着向每个帐户添加一行。 完成这些事务并成功写入行是非常重要的。

    暂时取消账户余额不是什么大问题,这就是一天结算和解的目的。 而且从账户透支更有可能发生,因为两台自动柜员机一次被使用,而不是从数据库中未提交的读取。

    也就是说,SQL Server 2005修复了使NOLOCK必要的大部分漏洞。 所以除非你使用SQL Server 2000或更早的版本,否则你不需要它。

    进一步阅读
    行级版本控制


    不幸的是,它不仅仅是读取未提交的数据。 在后台,您最终可能会翻阅两次页面(在页面拆分的情况下),或者您可能完全忽略页面。 所以你的结果可能会严重扭曲。

    查看Itzik Ben-Gan的文章。 这是一个摘录:

    “使用NOLOCK提示(或将会话的隔离级别设置为READ UNCOMMITTED),您告诉SQL Server您不期望一致性,因此没有保证。请记住,”不一致的数据“不仅仅意味着您可能会看到以后回滚的未提交的更改或处于中间状态的事务中的数据更改, 这也意味着在扫描所有表/索引数据的简单查询中,SQL Server可能会丢失扫描位置,或者最终可能两次获得同一行 。“

    链接地址: http://www.djcxy.com/p/94685.html

    上一篇: What is "with (nolock)" in SQL Server?

    下一篇: What is the best way to paginate results in SQL Server