【发布时间】:2008-11-13 17:27:34
【问题描述】:
如果您从不修改行,而只是插入或删除行,那么对 select 语句和 insert 语句使用 MS SQL 的 WITH (NOLOCK) 选项是否安全?
我..e 你永远不会对任何行进行更新。
【问题讨论】:
标签: sql sql-server-2005
如果您从不修改行,而只是插入或删除行,那么对 select 语句和 insert 语句使用 MS SQL 的 WITH (NOLOCK) 选项是否安全?
我..e 你永远不会对任何行进行更新。
【问题讨论】:
标签: sql sql-server-2005
如果您询问是否会获得可能不再准确的数据,那么这取决于您的查询。例如,如果您执行以下操作:
SELECT
my_id,
my_date
FROM
My_Table
WHERE
my_date >= '2008-01-01'
在插入日期为 2008-01-01 或之后的行的同时,您可能无法获得该新行。这也会影响生成聚合的查询。
如果您只是通过删除/插入来模拟更新,那么您也可能会获得“旧”版本的数据。
【讨论】:
一般不会。 (即 UPDATE 不是唯一的锁定问题)
如果您正在插入(或删除)记录,并且选择可能会指定该集合中的记录,那么是的,NOLOCK 会给您一个脏读,可能包括也可能不包括这些记录。
如果永远不会选择插入或删除(例如读取的数据始终是昨天的数据,而今天进入或被操作的数据永远不会被读取),那么是的,它是“安全的”。
【讨论】:
如果您从不进行任何更新,那么为什么锁定首先会给您带来问题?
如果存在引用完整性或触发问题,那么 NOLOCK 只会将这些错误变成神秘的不一致。
【讨论】:
“安全”是一个非常笼统的术语;这一切都取决于您的应用程序的上下文及其使用。但是当使用 NOLOCK 提示时,总是有可能跳过和重复计算以前提交的行。
无论如何,请阅读以下内容: http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx
【讨论】:
如果您将自己限制为 INSERT 和 DELETE,则不确定 SELECT 语句会如何发生冲突。 INSERT 是有问题的,例如,在查询期间可能插入了冲突的主键。 INSERT 和 DELETE 都将您暴露于 WHERE 子句中表达的条件,或者 JOIN 等可能在您的语句执行期间变得无效。
【讨论】: