【问题标题】:TSQL Isolation Levels in Dynamic Query动态查询中的 TSQL 隔离级别
【发布时间】:2014-12-04 06:07:13
【问题描述】:

存储过程中指定的隔离级别是否会传递到该存储过程中的动态查询?

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

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

【问题讨论】:

标签: sql-server tsql isolation-level


【解决方案1】:

它确实可以进行动态查询,您可以使用以下内容进行检查:

DBCC useroptions;

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

【讨论】:

    【解决方案2】:

    通常不仅仅是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;
    

    【讨论】:

      【解决方案3】:

      我相信您确实具有隔离级别。我做了这个测试,我在动态查询中获得了隔离级别 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
      

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 2018-08-04
        • 1970-01-01
        相关资源
        最近更新 更多