存储过程 SQL Server 的隔离级别?

问题描述 投票:0回答:3

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

尝试#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
3个回答
22
投票

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

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

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

所以这实际上取决于您想做什么:

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

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


0
投票

设置事务隔离级别读已提交 这适用于会话级别,您可以为当前会话进行设置并运行存储过程。或者您也可以在存储过程中使用它作为第一个语句来始终设置读取未提交。

隔离时读取未提交的内容 这适用于单独的查询级别。如果存在联合运算符,则应将其添加到最后一个查询的末尾。

这两者都不能用于以下类型的状态,proc 中的语句应该是 SELECT 或 SELECT INTO 或 Searched DELETE、INSERT from full select、Searched Update。

  • 子查询
  • 插入语句

-2
投票

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

尝试#2是设置

ISOLATION LEVEL
的好习惯。

© www.soinside.com 2019 - 2024. All rights reserved.