如果您从不修改行,只插入或删除行,那么对select语句和插入语句使用MS SQL的WITH(NOLOCK)选项是否安全?
我......你永远不会对任何行进行更新。
答案 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提示时,总是有可能跳过并重复计算先前提交的行。
答案 4 :(得分:-1)
如果您将自己限制为INSERT和DELETE,则不确定SELECT语句如何发生冲突。 INSERT是有问题的,例如,在查询期间可能存在插入的主键冲突。 INSERT和DELETE都会使您接受WHERE子句中表达的条件,或JOINs等在语句执行期间可能变为无效。