什么时候会释放“嵌套事务”中的 XLOCK?

Iam*_*mIC 4 sql-server scope stored-procedures locking transactions

在 SQL Server 2008 中,我知道没有嵌套事务这样的东西。这些似乎只是存在。我也知道一些专家强烈恳求开发人员不要使用可用的伪嵌套事务。例如,这里

但是,我有一个案例,我需要在特定嵌套过程中的一行上使用 XLOCK,但仅限于该过程的持续时间。它必须是那个锁,我显然想尽快放下锁。在伪代码中:

...outer procedure
BEGIN TRAN Inner
EXEC InnerProcedure

    ...InnerProcedure...
    BEGIN TRAN Inner
    SELECT ... WITH (XLOCK, ROWLOCK)
    COMMIT TRAN Inner
    -- NEVER rollback here; get the outer procedure to do this
    ...End InnerProcedure...

COMMIT TRAN Outer
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 考虑到 SQL Server 并未真正嵌套事务,这是最佳实践模式吗?
  2. XLOCK 会在 COMMIT TRAN Inner 发布,还是只在 COMMIT TRAN Outer 发布?我想答案是肯定的。

Mit*_*eat 5

  1. 不。不要使用“嵌套”事务(即使在 TSQL 中)。充其量,它们不会像您想象的那样工作:每天一个 SQL Server DBA 神话:(26/30) 嵌套事务是真实的 (False)

  2. XLOCK 将在外部事务范围内释放。[更新:包括雷木思的建议]