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

16

我想在我的存储过程中添加隔离级别,为此我想确认以下哪种格式是正确的:

尝试 #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
请提出建议。
2个回答

22
两种方法都是“正确”的——它们只是做了不同的事情:
1. 你的尝试 #1 在该数据库和连接中设置了隔离级别,这意味着选择的隔离级别将用于任何未来的语句,直到再次更改隔离级别。
2. 你的尝试 #2 仅在存储过程内设置了隔离级别——因此一旦存储过程完成,就会恢复到数据库/连接级别上存在的隔离级别。
因此,这真的取决于你想要做什么:
- 为当前连接设置不同的隔离级别?任何未来的语句都将在此隔离级别下运行--> 选择 #1 - 仅为单个存储过程设置不同的隔离级别——无论连接/数据库之前有什么——那就使用 #2

-1

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

尝试 #2 设置 ISOLATION LEVEL 是一个好的实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接