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

Bos*_*oss 6 stored-procedures isolation-level sql-server-2012

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

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

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

EXEC [sp_GetProductDetails] 'ABCD','2017-02-20T11:51:37.3178768'
Run Code Online (Sandbox Code Playgroud)

尝试#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
Run Code Online (Sandbox Code Playgroud)

请建议.

mar*_*c_s 5

两种版本都是“正确的”-它们只是做不同的事情

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

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

因此,这实际上取决于您要执行的操作:

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

  • 仅针对单个存储过程将隔离级别设置为不同的设置-不管连接/数据库之前的内容如何-然后使用#2