我正在处理需要查询实时 CRM 系统的 DW 项目。标准隔离级别会对性能产生负面影响。我很想使用未提交的无锁/事务隔离级别。我想知道脏读识别了多少选定的行。
3 回答
也许你可以这样做:
SELECT * FROM T WITH (SNAPSHOT)
EXCEPT
SELECT * FROM T WITH (READCOMMITTED, READPAST)
但这本质上是活泼的。
为什么你需要知道这一点?
您使用TRANSACTION ISOLATION LEVER READ UNCOMMITTED
just 表示该SELECT
语句不会等到表/页面/行上的任何更新/插入/删除事务完成 - 甚至会抓取脏记录。你这样做是为了提高性能。试图获取有关哪些记录是脏的信息就像打在你脸上的搅拌机一样。它很痛,除了痛苦,什么也没有给你。因为它们在某些时候是脏的,现在它们不是了。还是还很脏?谁知道...
更新
现在关于数据质量。想象一下,您使用如下查询读取脏记录:
SELECT *
FROM dbo.MyTable
WITH (NOLOCK)
例如用id = 1
and记录name = 'someValue'
。比您要更新名称,将其设置为“anotherValue” - 所以你做以下查询:
UPDATE dbo.MyTable
SET
Name = 'anotherValue'
WHERE id = 1
因此,如果此记录存在,您将在那里获得实际值,如果它被删除(即使在脏读时 - 已删除但尚未提交) - 没有发生任何可怕的事情,查询不会影响任何行。这是个问题吗?当然不是。因为在您阅读和更新之间的时间可能会改变无数次。只需检查@@ROWCOUNT
以确保查询完成了它必须做的事情,并警告用户有关结果。
无论如何,这取决于数据的情况和重要性。如果数据必须是真实的 - 不要使用脏读
标准隔离级别会对性能产生负面影响
那你为什么不解决这个问题?你知道脏读是不一致的读,所以你不应该使用它们。显而易见的答案是使用快照隔离。阅读在 SQL Server 中实现快照或读取提交的快照隔离:指南。
但问题实际上更深。为什么会遇到阻塞?为什么读被写阻塞?DW 工作负载不应该在操作事务数据上松散,这就是我们使用 ETL 和 OLAP 产品的原因。考虑一下多维数据集、列存储、powerpivot,所有这些都允许非常快速的DW 和分析。不要用端到端的分析扫描给业务运营数据库带来负担,你只会遇到问题。