存儲過程中的指定隔離級別是否貫穿該存儲過程中的動態查詢?動態查詢中的TSQL隔離級別
CREATE PROCEDURE MySP AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dSQL VARCHAR(max) = 'SELECT col FROM table';
EXEC(@dSQL);
END
那麼,該動態查詢中的隔離級別是什麼?
存儲過程中的指定隔離級別是否貫穿該存儲過程中的動態查詢?動態查詢中的TSQL隔離級別
CREATE PROCEDURE MySP AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dSQL VARCHAR(max) = 'SELECT col FROM table';
EXEC(@dSQL);
END
那麼,該動態查詢中的隔離級別是什麼?
它通過動態查詢攜帶,你可以用這樣的檢查:
DBCC useroptions;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dSQL VARCHAR(max) = 'DBCC useroptions';
EXEC(@dSQL);
我相信你隨身攜帶的隔離級別。我做了這個測試,我在動態查詢
-- 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
得到隔離級別1更普遍的不僅僅是TRANSACTION ISOLATION LEVEL
,SET
聲明會話水平,從而通過攜帶到子進程。但是,雖然可以在子進程中更改它們,但這些更改不會回到調用/父級上下文中。
有關更多詳細信息,請參閱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;
看到:HTTP:/
您可以通過以下操作輕鬆地測試此/stackoverflow.com/questions/1045634/transaction-isolation-level-scopes - 你可以使用類似的代碼來測試你的動態sql。 – JohnLBevan 2014-12-03 21:25:21