在AZURE SQL 2012(标准:S0)上运行存储过程CSP1时,我也同时运行
SELECT TOP 10 *
FROM [affected_table] WITH (NOLOCK)
ORDER BY 1 DESC
返回[affected_table]中的10条记录,包括CSP1未提及的记录。当CSP1失败并且ROLLBACK时,没有记录插入[affected_table]
但是当我用NOLOCK重新运行相同的SELECT
查询时,我仍然可以在那里看到所有那些幻像记录。
ROLLBACK结束后是否应该清除它们?
我应该清除缓存吗?
答案 0 :(得分:-4)
修改强> 经过一些批评性的批评后,我堕落了,我脱离了真正的问题。
1)在未提交或回滚事务时,脏读取保持“可见”。请注意,这可能需要一个未定义的时间,并且可以通过其他并发事务保持(bloked)更长时间。
2)当然,但发出回滚或提交不必要的行为imediatly。您的(更新,插入,删除)事务发出了独占锁,唯一不利于阻止脏读的事情是使用更严格的隔离级别。
3)你永远不会在生产中搞乱缓存!它在开发中是可以的,甚至在某些性能测试中也很好。
管理并发是任何DBMS中不可或缺的一部分,它是在没有人为干预的情况下自动完成的(大部分时间),实际上引擎的设计考虑到了这一点。 当然,您可以更改隔离级别,甚至尝试使用提示。
如果您的要求需要高度同意并允许脏读,请注意您无法预测他们患病的时间。 如果你不能允许脏读取坚持读取提交,从不使用nolock提示。
是TSQL中常用的Cargo Cult。它几乎是强制性的(SQL Server 7),但随着隔离架构(SQL Server 2000)的变化,它几乎已经过时了。事实上,自从SQL Server 2005以来,它被认为是一种不好的做法。
如果您阅读链接的MSDN文档,您会看到NOLOCK是 READUNCOMMITTED 的旧名称,允许脏读。
有些人认为 NOLOCK 会神奇地提高性能并治愈死锁和秃顶。
恕我直言,你可以尝试摆脱所有NOLOCKS。
注意:如果你移除了一个nolock并且你的系统出现了严重的死锁情况,那仅仅意味着NOLOCK正在掩盖另一个更严重的问题。有些情况下推荐nolock,但它们很少见,需要一位优秀的DBA注意。