插入/更新后跟选择(nolock)是不是会产生具有相同数据的意外结果?

Posted

技术标签:

【中文标题】插入/更新后跟选择(nolock)是不是会产生具有相同数据的意外结果?【英文标题】:Can an Insert/update followed by a select (nolock) yield unexpected results with same data?插入/更新后跟选择(nolock)是否会产生具有相同数据的意外结果? 【发布时间】:2016-11-06 16:27:15 【问题描述】:

在存储过程中,

在同一记录上执行插入/更新后跟选择(无锁)会产生意外结果吗?

我是否总是得到(完整的)更新/插入的记录?

提前感谢您的帮助!

【问题讨论】:

如果你在乎,为什么要使用NOLOCK 提示? 防止 (b) 锁定,但我们偶尔会注意到一些奇怪的结果。有很多并发线程,都在唯一的记录上运行(新的或更新的) NOLOCK 扫描期间的并发插入/更新活动可能会导致行丢失或重复。除非您的应用程序依赖于悲观锁定,否则最好打开 READ_COMMITTED_SNAPSHOT 数据库选项。 【参考方案1】:

如果一切都由单个进程完成,那么数据将是正确的。 但是,如果从不同的进程 ID 调用存储过程,并且用户在其他进程中执行 select(nolock),则 select 可能会发生数据差异。

因为存储过程可能仍在使用中。

【讨论】:

谢谢Signh!有很多并发线程,都在唯一的记录(新的或更新的)上运行。还是没问题? 理想情况下不应该使用 nolock 和 read uncommitted 但如果您将结果集绘制到图表或仪表板上并且您可以承受一些差异,因为它们显示了胎面,那么您可以使用 nolock。

以上是关于插入/更新后跟选择(nolock)是不是会产生具有相同数据的意外结果?的主要内容,如果未能解决你的问题,请参考以下文章

XQuery(或 XPath)是不是具有更新、插入和删除以及选择的等价物?

NOLOCK 提示会减慢操作吗?

为啥更新现有密钥的优先级会产生不一致的结果?

什么时候适合使用 NOLOCK?

SQL nolock 和 join

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