当我看到以下结构时,我一直在查看我们的系统上的一些存储过程:
(表示实际SP的伪代码,服务器正在使用默认隔离级别):
CREATE PROCEDURE ...
AS
BEGIN
IF NOT EXISTS(SELECT ...)
BEGIN
RETURN;
END
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
DML...
DML...
DML...
COMMIT
END我没有看到事务隔离级别在事务边界内被声明,我想知道它的效果是什么?
事务提交后是否恢复了隔离级别(因此,如果在提交之后有其他语句--它们的隔离级别是什么)?
在这种情况下,如果在事务开始之前声明隔离级别,我假设不会有什么不同。是这样吗?
大多数情况下,我对此感到有些吃惊,因为我只看到过在事务之外声明的事务隔离,而不是在事务内部声明的--为什么?这样做有什么好处。
发布于 2019-07-16 11:06:04
下面是设置事务隔离级别文档的相关摘录。
一次只能设置一个隔离级别选项,并且在显式更改该连接之前,该选项仍然是设置的。事务中执行的所有读取操作都按照指定隔离级别的规则操作,除非语句的FROM子句中的表提示指定表的不同锁定或版本控制行为。
它接着说:
如果在存储过程或触发器中发出SET事务隔离级别,则当对象返回控件时,将隔离级别重置为调用对象时生效的级别。例如,如果在批处理中设置可重复读取,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制返回给批处理时,隔离级别设置将恢复为可重复读取。
请注意,没有提到BEGIN TRANSACTION、COMMIT等。这些事务控制语句不影响当前会话事务隔离级别。
我不认为在BEGIN TRAN之后指定事务隔离级别有什么不同。也许开发人员希望确保这个级别对读者来说是显而易见的,并且认为最好的位置是在事务边界,而不是必须查看proc代码的开头。
https://dba.stackexchange.com/questions/242971
复制相似问题