2014-12-03 26 views
1

存储过程中的指定隔离级别是否贯穿该存储过程中的动态查询?动态查询中的TSQL隔离级别

CREATE PROCEDURE MySP AS 
BEGIN 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
DECLARE @dSQL VARCHAR(max) = 'SELECT col FROM table'; 
EXEC(@dSQL); 
END 

那么,该动态查询中的隔离级别是什么?

+0

看到:HTTP:/

您可以通过以下操作轻松地测试此/stackoverflow.com/questions/1045634/transaction-isolation-level-scopes - 你可以使用类似的代码来测试你的动态sql。 – JohnLBevan 2014-12-03 21:25:21

回答

2

它通过动态查询携带,你可以用这样的检查:

DBCC useroptions; 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
DECLARE @dSQL VARCHAR(max) = 'DBCC useroptions'; 
EXEC(@dSQL); 
1

我相信你随身携带的隔离级别。我做了这个测试,我在动态查询

-- Create the SP (my test is on AdventureWorks2012) 
CREATE PROCEDURE MySP AS 
BEGIN 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
DECLARE @dSQL VARCHAR(max) = 'SELECT * FROM Person.Person; WAITFOR DELAY ''02:00'';'; 
EXEC(@dSQL); 
END 

-- Exec SP 
EXEC MySP 

-- Check the isolation level while your dynamic code is running 
SELECT transaction_isolation_level, * FROM sys.sysprocesses t1 
JOIN sys.dm_exec_requests t2 on t1.spid = t2.session_id 
WHERE t1.spid > 50 
0

得到隔离级别1更普遍的不仅仅是TRANSACTION ISOLATION LEVELSET声明会话水平,从而通过携带到子进程。但是,虽然可以在子进程中更改它们,但这些更改不会回到调用/父级上下文中。

有关更多详细信息,请参阅SET Statements的MSDN页面。

SSMS查询标签1:

-- DROP TABLE ##tmp; 
CREATE TABLE ##tmp (Col1 INT); 
INSERT INTO ##tmp (Col1) VALUES (1); 

BEGIN TRAN 
SELECT * FROM ##tmp WITH (HOLDLOCK, TABLOCKX); 
WAITFOR DELAY '00:02:00.000'; -- 2 minute timer 
ROLLBACK TRAN; 

SSMS查询表2:

-- First, highlight the following and run. It will hang. Cancel the query. 
-- SELECT * FROM ##tmp; 

-- Second, hit F5. It will return the row twice. 
-- If the SET command in the EXEC affected the parent process, the 2nd SELECT 
-- would hang. 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

EXEC (N' SELECT * FROM ##tmp; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;'); 

SELECT * FROM ##tmp;