今天,当我看到以下结构时,我一直在查看我们系统上的一些存储过程:
(伪代码表示实际SP,服务器使用默认隔离级别):
CREATE PROCEDURE ...
AS
BEGIN
IF NOT EXISTS(SELECT ...)
BEGIN
RETURN;
END
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
DML...
DML...
DML...
COMMIT
END
我还没有看到在事务边界内声明事务隔离级别,我想知道它的效果是什么?
提交事务后是否恢复隔离级别(因此,如果提交后有其他语句 - 它们的隔离级别是什么)?
在这种情况下,我认为如果在事务开始之前声明隔离级别不会有任何区别。是这样吗?
大多数情况下,我看到这一点有点吃惊,因为我只见过在事务之外声明事务隔离,而不是在事务内部,我想知道 - 为什么?这样做有什么好处。
以下是SET TRANSACTION ISOLATION LEVEL 文档的相关摘录。
它接着说:
注意这里没有提到
BEGIN TRANSACTION
,COMMIT
等。这些事务控制语句不影响当前会话事务隔离级别。我看不出与在
BEGIN TRAN
. 也许开发人员想确保该级别对读者来说是显而易见的,并认为最好的位置是在事务边界,而不是必须查看 proc 代码的开头。