【问题标题】:Isolation Level for stored procedure SQL Server?存储过程 SQL Server 的隔离级别?
【发布时间】:2017-02-21 06:31:41
【问题描述】:

我想在我的程序中添加隔离级别,为此我想从下面确认哪个是正确的格式:

尝试 #1 - 在调用存储过程之前设置隔离级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

EXEC [sp_GetProductDetails] 'ABCD','2017-02-20T11:51:37.3178768'

尝试 #2 - 在存储过程中设置隔离级别:

CREATE PROCEDURE MySP AS
BEGIN
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   BEGIN TRAN 
       SELECT * FROM MyTable
       SELECT * FROM MyTable2
       SELECT * FROM MyTable3

       COMMIT TRAN  
END

请提出建议。

【问题讨论】:

    标签: stored-procedures sql-server-2012 isolation-level


    【解决方案1】:

    两个版本都是“正确的”——它们只是做了不同的事情

    • 您的尝试 #1 设置了该数据库和连接的隔离级别 - 这意味着,所选的隔离级别将用于任何未来的语句 - 直到您再次更改隔离级别

    • 您的尝试 #2 设置隔离级别仅在存储过程内部 - 所以一旦存储过程完成,数据库/连接级别上存在的隔离级别将再次恢复

    所以这真的取决于你想做什么:

    • 为您当前与此数据库的连接将隔离级别设置为一般不同的级别?未来的任何语句都将在此隔离级别下运行 --> 选择 #1

    • 将隔离级别设置为仅针对单个存储过程的不同设置 - 无论之前的连接/数据库有什么 - 然后使用 #2

    【讨论】:

      【解决方案2】:

      ISOLATION LEVEL READ COMMITTED 是 SQL 数据库的默认隔离。

      尝试 #2 是设置ISOLATION LEVEL 的好习惯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 2018-06-27
        • 2010-11-10
        相关资源
        最近更新 更多