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
),但您将跳过所有当前锁定的行。
归档时间: |
|
查看次数: |
44118 次 |
最近记录: |