存储过程中的指定隔离级别是否贯穿该存储过程中的动态查询?动态查询中的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