SQL Server 上的脏读

1 performance sql-server transaction isolation-level query-performance

  1. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 位于“BEGIN”的不同部分。以下两个查询的行为是否相同?

  2. 视图 viewOne 和 viewTwo 会继承脏读吗?或者视图需要有一个明确的“NOLOCK”

查询 1

set transaction isolation level read uncommitted
begin    
    select col1 from viewOne
    select * from viewTwo
    select * from table1
end
Run Code Online (Sandbox Code Playgroud)

查询 2

begin    
    set transaction isolation level read uncommitted
    select col1 from viewOne
    select * from viewTwo
    select * from table1     
end
Run Code Online (Sandbox Code Playgroud)

Sco*_*red 5

从这个文档 - SET TRANSACTION ISOLATION LEVEL - 在 REMARKS 下

一次只能设置一个隔离级别选项,并且它会一直为该连接设置,直到它被显式更改。除非语句的 FROM 子句中的表提示为表指定了不同的锁定或版本控制行为,否则在事务中执行的所有读取操作都在指定隔离级别的规则下运行。

您可以使用此查询来确定您当前所处的隔离级别:

SELECT CASE transaction_isolation_level 
WHEN 0 THEN 'Unspecified' 
WHEN 1 THEN 'ReadUncommitted' 
WHEN 2 THEN 'ReadCommitted' 
WHEN 3 THEN 'Repeatable' 
WHEN 4 THEN 'Serializable' 
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
where session_id = @@SPID
Run Code Online (Sandbox Code Playgroud)