存储过程的隔离级别 SQL 服务器?

Isolation Level for stored procedure SQL Server?

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

尝试 #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

求推荐。

两个版本都是 "correct" - 它们只是做 不同的事情:

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

  • 您的尝试#2 设置了隔离级别仅在存储过程内部 - 因此一旦存储过程完成,存在于database/connection等级再次恢复

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

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

  • 只为单个存储过程将隔离级别设置为不同的设置 - 不管 connnection/database 之前有什么 - 然后使用 #2

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

尝试 #2 是设置 ISOLATION LEVEL.

的好习惯