首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务隔离级别声明位置的差异-在事务内部/外部?

事务隔离级别声明位置的差异-在事务内部/外部?
EN

Database Administration用户
提问于 2019-07-16 09:18:04
回答 1查看 98关注 0票数 1

当我看到以下结构时,我一直在查看我们的系统上的一些存储过程:

(表示实际SP的伪代码,服务器正在使用默认隔离级别):

代码语言:javascript
复制
CREATE PROCEDURE ...
AS
BEGIN
  IF NOT EXISTS(SELECT ...) 
  BEGIN
    RETURN; 
  END

  BEGIN TRAN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    DML...
    DML...
    DML...
  COMMIT
END

我没有看到事务隔离级别在事务边界内被声明,我想知道它的效果是什么?

事务提交后是否恢复了隔离级别(因此,如果在提交之后有其他语句--它们的隔离级别是什么)?

在这种情况下,如果在事务开始之前声明隔离级别,我假设不会有什么不同。是这样吗?

大多数情况下,我对此感到有些吃惊,因为我只看到过在事务之外声明的事务隔离,而不是在事务内部声明的--为什么?这样做有什么好处。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2019-07-16 11:06:04

下面是设置事务隔离级别文档的相关摘录。

一次只能设置一个隔离级别选项,并且在显式更改该连接之前,该选项仍然是设置的。事务中执行的所有读取操作都按照指定隔离级别的规则操作,除非语句的FROM子句中的表提示指定表的不同锁定或版本控制行为。

它接着说:

如果在存储过程或触发器中发出SET事务隔离级别,则当对象返回控件时,将隔离级别重置为调用对象时生效的级别。例如,如果在批处理中设置可重复读取,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制返回给批处理时,隔离级别设置将恢复为可重复读取。

请注意,没有提到BEGIN TRANSACTIONCOMMIT等。这些事务控制语句不影响当前会话事务隔离级别。

我不认为在BEGIN TRAN之后指定事务隔离级别有什么不同。也许开发人员希望确保这个级别对读者来说是显而易见的,并且认为最好的位置是在事务边界,而不是必须查看proc代码的开头。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/242971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档