dmo*_*ney 12 sql-server isolation-level
我SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在大多数一般 SQL 查询中使用,主要是因为这是我最初学习语言时深入了解的。
根据我的理解,这种隔离级别的行为方式与WITH (NO LOCK)我只倾向于使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
WITH (NO LOCK)over SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED阻止其他用户被锁定在我正在阅读的表格之外?SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED用于停止锁,而我只是在读取数据,那么使用它有什么意义?是否只有系统密集型查询会生成锁?在运行会在 5-10 秒内返回的查询时是否值得使用它?SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在读取将用于更新的数据时不要使用 ,大概是为了避免更新脏数据。这会是唯一的原因吗?SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在我的查询中使用。我知道这可能会导致脏读。除了接收回可能不会提交到数据库的数据(因此将我的结果扔掉)之外,还有哪些其他类型的“脏读”是可能的?对不起,群众问题。
Ion*_*nic 27
太可怕了,你是这样学的(对不起!)。
READ UNCOMMITTED让你读每一行,是的。甚至那些目前在INSERT, UPDATE,DELETE操作中使用的人。如果您需要快速查看一些数据或在任务关键 -SELECT语句中块会非常有害,这将非常有用。
事实上,你冒着诚信的风险。您可能会读取当前用于删除或更改的行。您也可能读取错误的值。这可能真的不常见,但它可能发生。我是什么意思?好吧,想想一个非常宽的行(它有很多列和很多长nvarchar列)。此行发生更新并设置新值。在极少数情况下,您可能会遇到只阅读半行的情况。例如,如果用户更改了他的登录值,则可能会发生另一件事。他更改了他的邮件 + 密码。邮件已设置,但密码尚未设置。这样你就有了一个不一致的状态。
我建议忘记READ UNCOMMITTED。只需在真正需要的地方使用它。
另一种选择是启用READ_COMMITTED_SNAPSHOT数据库选项 -READ COMMITTED SNAPSHOT由于在 tempdb 中启用了行版本控制,因此您可以使用。这样,您只需读取一行的另一个(旧)版本。这不会阻止您的查询。但是可能会发生您也读取了旧值,但是是一致的旧值。
另一个想法可以WITH(READPAST)代替WITH(NOLOCK). 您将读取表的旧状态(有点像 中的SNAPSHOT ISOLATION),但您将跳过所有当前锁定的行。