SQL Server NOLOCK 提示会返回部分写入的行吗?

Posted

技术标签:

【中文标题】SQL Server NOLOCK 提示会返回部分写入的行吗?【英文标题】:Will SQL Server NOLOCK hint return partially written rows? 【发布时间】:2009-10-02 19:25:58 【问题描述】:

首先,我不是在问是否应该使用 NOLOCK。让我们过去吧。

我想问题归结为sql server如何写入数据?是一次写入一整行还是一次写入一列?

我问是因为正在考虑 NOLOCK 提示。只要返回(或不返回)整行,脏读就可以了。部分写入的行是不可接受的。

【问题讨论】:

For LOB/ Off row data this might be possible 【参考方案1】:

没有。插入、更新和删除等数据修改操作受低级物理Latches 保护。所有数据访问操作,包括无锁 SELECT,都必须符合锁存协议。结果是任何读者都看不到部分写入。

【讨论】:

【参考方案2】:

不,它不会返回部分写入的行。 NOLOCK 仅表示此查询不会创建新锁。这并不意味着它不会尊重现有的锁,并且 sql server 不会在没有先获取锁的情况下执行任何写入数据的操作。

它可能会返回已过期或不再相关的行,因为其他内容写入了通常会被此查询锁定的行。

【讨论】:

忽略已存在的锁 "不发布共享锁以防止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻止当前事务读取锁定的数据。 "来自technet.microsoft.com/en-us/library/ms187373.aspx 它不会发出锁,但是更新可以修改行,而带有 nolock 的 select 正在读取它,所以如果是这种情况,我认为您可以获得部分写入的行。

以上是关于SQL Server NOLOCK 提示会返回部分写入的行吗?的主要内容,如果未能解决你的问题,请参考以下文章

[SQL SERVER][Performance]小心使用With NoLock

SQL Server 中WITH (NOLOCK)

SQL SERVER,使用(TABLOCKX)选择查询会比使用(NOLOCK)更快,反之亦然?

SQL Server中CLR表值函数(table-valued function)不能使用WITH(NOLOCK)

带有 (NOLOCK) 提示的 SQL 服务器

SQL Server NOLOCK 与 JOIN,批量加载