【问题标题】:Is it safe to use MS SQL's WITH (NOLOCK) option for select statements and insert statements if对选择语句和插入语句使用 MS SQL 的 WITH (NOLOCK) 选项是否安全?
【发布时间】:2008-11-13 17:27:34
【问题描述】:

如果您从不修改行,而只是插入或删除行,那么对 select 语句和 insert 语句使用 MS SQL 的 WITH (NOLOCK) 选项是否安全?

我..e 你永远不会对任何行进行更新。

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    如果您询问是否会获得可能不再准确的数据,那么这取决于您的查询。例如,如果您执行以下操作:

    SELECT
         my_id,
         my_date
    FROM
         My_Table
    WHERE
         my_date >= '2008-01-01'
    

    在插入日期为 2008-01-01 或之后的行的同时,您可能无法获得该新行。这也会影响生成聚合的查询。

    如果您只是通过删除/插入来模拟更新,那么您也可能会获得“旧”版本的数据。

    【讨论】:

      【解决方案2】:

      一般不会。 (即 UPDATE 不是唯一的锁定问题)

      如果您正在插入(或删除)记录,并且选择可能会指定该集合中的记录,那么是的,NOLOCK 会给您一个脏读,可能包括也可能不包括这些记录。

      如果永远不会选择插入或删除(例如读取的数据始终是昨天的数据,而今天进入或被操作的数据永远不会被读取),那么是的,它是“安全的”。

      【讨论】:

        【解决方案3】:

        如果您从不进行任何更新,那么为什么锁定首先会给您带来问题?

        如果存在引用完整性或触发问题,那么 NOLOCK 只会将这些错误变成神秘的不一致。

        【讨论】:

        • 因为锁升级:如果他从同一个页面抓取了一堆记录,sql server可能会自动升级锁覆盖整个页面。如果他想插入该页面,他必须等待。
        【解决方案4】:

        “安全”是一个非常笼统的术语;这一切都取决于您的应用程序的上下文及其使用。但是当使用 NOLOCK 提示时,总是有可能跳过和重复计算以前提交的行。

        无论如何,请阅读以下内容: http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

        【讨论】:

          【解决方案5】:

          如果您将自己限制为 INSERT 和 DELETE,则不确定 SELECT 语句会如何发生冲突。 INSERT 是有问题的,例如,在查询期间可能插入了冲突的主键。 INSERT 和 DELETE 都将您暴露于 WHERE 子句中表达的条件,或者 JOIN 等可能在您的语句执行期间变得无效。

          【讨论】:

            猜你喜欢
            • 2017-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-24
            • 2021-02-19
            • 1970-01-01
            相关资源
            最近更新 更多