如果使用MS SQL的WITH(NOLOCK)选项对select语句和insert语句是否安全?

时间:2008-11-13 17:27:34

标签: sql sql-server-2005

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

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

5 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

如果存在参考完整性或触发器触发问题,那么NOLOCK只会将这些错误转化为神秘的不一致。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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