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