是否可以从一个存储过程中调用另一个设置较低事务隔离级别的存储过程?

Use*_*ser 3 sql-server stored-procedures transactions transaction-isolation

我有一堆实用程序只检查数据库中的某些条件并返回标志结果.这些过程使用READ UNCOMMITTED隔离级别运行,相当于WITH NOLOCK.

我还有更复杂的程序,使用SERIALIZABLE隔离级别运行.他们也恰好在其中进行了同样的检查.

所以我决定从这些复杂的程序中调用这些检查程序,而不是复制检查代码.

基本上它看起来像这样:

CREATE PROCEDURE [dbo].[CheckSomething]
AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    BEGIN TRANSACTION

    -- Do checks

    COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

CREATE PROCEDURE [dbo].[DoSomethingImportant]
AS
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

    BEGIN TRANSACTION

    EXECUTE [dbo].[CheckSomething]

    -- Do some work

    COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

那样做可以吗?暂时激活的较低隔离级别会以某种方式破坏更高级别的保护还是一切都完全安全?

编辑:执行顺利,没有任何错误.

gbn*_*gbn 5

这就是SQL Server 2005 的全部内容.一个片段:

将事务从一个隔离级别更改为另一个隔离级别时,根据新级别的规则保护在更改后读取的资源.在更改之前读取的资源将继续根据上一级别的规则进行保护.例如,如果事务从READ COMMITTED更改为SERIALIZABLE,则更改后获取的共享锁现在保持到事务结束.

如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别.例如,如果在批处理中设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ.

在这个例子中:

  • 每个隔离级别都适用于存储过程的范围
  • DoSomethingImportant锁定的资源保持在SERIALIZABLE下
  • CheckSomething使用的资源是READ UNCOMMITTED