什么时候会发布“嵌套交易”中的XLOCK?

时间:2010-12-12 12:17:00

标签: sql-server stored-procedures transactions locking scope

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

但是,我有一个案例需要在特定的嵌套过程中对一行进行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

我的问题是:

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

1 个答案:

答案 0 :(得分:4)

  1. 没有。不要使用'嵌套'事务(即使在TSQL中)。充其量,它们无法按您的想法运作:A SQL Server DBA myth a day: (26/30) nested transactions are real (False)

  2. XLOCK将在外部事务范围内发布。 [更新:包括Remus的建议]