Когда будет выпущен XLOCK в «вложенной транзакции»? - PullRequest
3 голосов
/ 12 декабря 2010

В 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

Мои вопросы:

  1. Является ли это шаблоном передового опыта, учитывая, что SQL Server действительно не вкладывает транзакции?
  2. Будет лиXLOCK будет выпущен на COMMIT TRAN Inner или только на COMMIT TRAN Outer?Я предполагаю, что ответ - да.

1 Ответ

4 голосов
/ 12 декабря 2010
  1. Нет. Не используйте «вложенные» транзакции (даже в TSQL). В лучшем случае они не будут работать так, как вы думаете: Миф администратора баз данных SQL Server в день: (26/30) вложенные транзакции реальны (ложно)

  2. XLOCK будет выпущен во внешней области транзакции. [Обновлено: чтобы включить совет Ремуса]

...