如何仅在SQL Server中选择UNCOMMITTED行?

BI *_*ude 9 sql t-sql sql-server transaction-isolation isolation-level

我正在研究DW项目,我需要查询实时CRM系统.标准隔离级别会对性能产生负面影响.我很想使用没有锁定/事务隔离级别读取未提交.我想知道脏读的标识有多少选定的行.

usr*_*usr 7

也许你可以这样做:

SELECT * FROM T WITH (SNAPSHOT)
EXCEPT
SELECT * FROM T WITH (READCOMMITTED, READPAST)
Run Code Online (Sandbox Code Playgroud)

但这本质上是活泼的.


Ser*_*gio 5

你为什么需要知道这个?

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以确保查询执行了必要的操作,并警告用户有关结果的信息.

无论如何,这取决于数据的情况和重要性.如果数据必须是实际的 - 不要使用脏读