【发布时间】:2019-01-03 16:58:53
【问题描述】:
在 SQL Server 中,我们有一系列存储过程来处理从包装过程调用的数据。在此过程结束时,它会执行一个过程来汇总数据并将其转储到单独数据库中的表中。数据在客户查看时不断变化,因此我们使用 (nolock) 提示来防止锁定表。我知道这不是最佳实践,但不幸的是我没有创建这个过程,我必须忍受它。正如我确信您所期望的那样,我遇到的问题是有时它会将脏数据插入汇总表中。当没有 BEGIN TRAN 时,有没有办法在执行我的程序之前提交我之前的程序中的新记录?另一个注意事项:我不能使用 BEGIN TRAN。
【问题讨论】:
-
如果您从脏读中提取数据并且不想插入到另一个表中,解决方案是停止使用 nolock。
-
如果你不想脏读,不要使用
NOLOCK。期间。 -
使用
NoLock不仅不是最佳实践,而且会完全损害数据的完整性,因为双读和脏读非常普遍。 -
对于这里关于 NOLOCK 的所有建议的一些很好的阅读,这里有一篇很好的文章(我有点惊讶@SeanLange 没有在他的评论中链接到)。 Bad habits : Putting NOLOCK everywhere
-
我正在阅读不良习惯文章,谢谢!
标签: sql-server transactions commit