3

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

我还有更复杂的过程,它们以 SERIALIZABLE 隔离级别运行。他们也碰巧有这些相同的支票。

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

基本上它看起来像这样:

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

    BEGIN TRANSACTION

    -- Do checks

    COMMIT TRANSACTION

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

    BEGIN TRANSACTION

    EXECUTE [dbo].[CheckSomething]

    -- Do some work

    COMMIT TRANSACTION

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

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

4

1 回答 1

5

SQL Server 2005的全部内容都在这里。一个片段:

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

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

在这个例子中:

  • 每个隔离级别都应用于存储过程的范围
  • DoSomethingImportant 锁定的资源保留在 SERIALIZABLE 下
  • CheckSomething 使用的资源是 READ UNCOMMITTED
于 2009-04-25T12:46:55.437 回答