MSSQL:链接服务器的事务隔离级别

Ale*_*huk 5 sql-server locking linked-server

我使用的是不断写入/读取的 MS SQL 数据库,以及通过链接服务器连接链接到的数据库。SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED这就是我在运行的每个查询中使用的原因。我的问题是,此事务级别是否会用于链接服务器上运行的查询?假设我的服务器被调用General并且它链接到服务器Linked。如果我运行以下查询:

select *
from General.TableName
join Linked.[Database].dbo.AnotherTableName on 1 = 1
Run Code Online (Sandbox Code Playgroud)

Linked.Database.dbo.AnotherTableName被(IS)锁定吗?

sig*_*nen 3

是的,它使用与“原始”服务器相同的隔离级别。例如,请参阅此查询来测试它:


-- Test various isolation levels and compare them
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT CASE ss.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 
,CASE ss2.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_LINKED 
, ss2.*
FROM sys.dm_exec_sessions  ss
inner join Linked.master.sys.dm_exec_sessions ss2
    ON  ss2.session_id >= 50
    and ss2.database_id = db_id('master')
--  and ss2.host_name = ss.host_name
where ss.session_id = @@SPID
Run Code Online (Sandbox Code Playgroud)

此查询尝试显示链接服务器中的会话 ID,并显示其他进程及其隔离级别。您会看到,当您更改原始服务器上的级别时,链接服务器上的“您的”隔离级别也会更改