2014-12-03 29 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;