如果我有一个带有 的存储过程set transaction isolation level read uncommitted
,它会影响更新语句吗?
我知道您不应该with (nolock)
在更新/删除语句上使用它,这几乎是相同的事情,但不确定 SQL 是否会在过程中的更新语句上忽略它,或者如果有更新语句,我是否应该小心不要使用它。
编辑:
对困惑感到抱歉。我并不是想弄清楚在操作语句上使用这种类型的锁定会产生什么影响,或者它是否是一个好主意。事实上,我不想在操作语句上使用这种锁定,所以我的问题是,是否将“设置事务...”放在我的存储过程的顶部,是否会受到更新/删除语句的尊重,或者是否它将被忽略。我希望它只是被忽略。
我完全了解它将对 select 语句产生的影响(及其优缺点)。
未提交读允许脏读。
X
在变为脏之前,将对行或更高级别(在数据页或索引中)进行锁定。在定位要更新的行时,查询直接访问的行将被U
锁定并被阻塞。但是,更新仍然可能受到隔离级别的影响。
连接 1
连接 2(在启动连接 1 后 10 秒内运行此程序)
结果
读取操作读取未提交的值,并且最终结果被使用,
UPDATE
即使100
读取的最终被回滚。“事务隔离级别”主要影响(在我的理解中)读操作的行为,即读操作是否会发出一些锁。在“读取未提交”的情况下,这是来自MSDN的引用
因此,对于您的问题,答案是否定的,更新不会受到同一存储过程中“读取未提交”事务隔离级别的影响。
-- 更新(一个例子来证明这个逻辑)在SSMS中,我们打开两个窗口,在窗口1(以下称为W1)中,运行以下命令
在另一个窗口 (W2) 中,运行以下命令(请参阅行为注释)
这意味着 W2 中的 UPDATE 语句(带有 READ UNCOMMITTED)不会像 SELECT 语句那样受事务隔离级别的影响(即仍按预期运行)。
-- 更新 2:根据 MSDN更新t-sql,
所以我的理解是,当您在 SQL Server 中运行 UPDATE 语句时,即使您可以在会话中读取脏数据,也无法更新脏数据(即未提交的数据)。
根据您的编辑,现在问题更清楚了..
事务隔离级别应该从读操作的角度来考虑。隔离级别控制如何保护读取操作免受其他写入操作的影响。
数据库引擎控制所有写入操作的锁定行为,您无法在数据库级别更改该行为。
来自BOL:
阅读: