BI *_*ude 9 sql t-sql sql-server transaction-isolation isolation-level
我正在研究DW项目,我需要查询实时CRM系统.标准隔离级别会对性能产生负面影响.我很想使用没有锁定/事务隔离级别读取未提交.我想知道脏读的标识有多少选定的行.
也许你可以这样做:
SELECT * FROM T WITH (SNAPSHOT)
EXCEPT
SELECT * FROM T WITH (READCOMMITTED, READPAST)
Run Code Online (Sandbox Code Playgroud)
但这本质上是活泼的.
你为什么需要知道这个?
您TRANSACTION ISOLATION LEVER READ UNCOMMITTED只是用来表示该SELECT语句不会等到表/页/行上的任何更新/插入/删除事务完成 - 并且甚至会抓取脏记录.而你这样做是为了提高性能.试图获取有关哪些记录是脏的信息就像打孔搅拌器一样.它伤害并且没有给你什么,但痛苦.因为他们在某些时候很脏,现在他们不是.还是还脏?谁知道...
UPD
现在关于数据质量.想象一下,您使用以下查询读取脏记录:
SELECT *
FROM dbo.MyTable
WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
例如,用id = 1和记录name = 'someValue'.比你想要更新名称,将其设置为'anotherValue` - 所以你做以下查询:
UPDATE dbo.MyTable
SET
Name = 'anotherValue'
WHERE id = 1
Run Code Online (Sandbox Code Playgroud)
因此,如果这个记录存在,你将获得实际值,如果它被删除(即使在脏读 - 已删除但尚未提交) - 没有发生任何可怕的事情,查询不会影响任何行.这是个问题吗?当然不是.在阅读和更新之间,时间可能会发生变化.只需检查@@ROWCOUNT以确保查询执行了必要的操作,并警告用户有关结果的信息.
无论如何,这取决于数据的情况和重要性.如果数据必须是实际的 - 不要使用脏读