Как откатить транзакцию в хранимой процедуре?

Глядя на электронную документацию по SQL Server, Microsoft, кажется, имеет (неверный)метод обработки вложенных транзакций в хранимой процедуре:

Nesting Transactions

Explicit transactions can be nested. This is primarily intended to support transactions in stored procedures that can be called either from a process already in a transaction or from processes that have no active transaction.

Далее в примере показана хранимая процедура, которая запускает собственную транзакцию (. «Процедура обеспечивает выполнение своей транзакции независимо от режима транзакции любого процесса, который ее выполняет».):

CREATE PROCEDURE TransProc @PriKey INT, @CharCol CHAR(3) AS
   BEGIN TRANSACTION InProc
     ...
   COMMIT TRANSACTION InProc;

Эта процедура затем может быть вызвана без выполнения транзакции:

EXECUTE TransProc 3,'bbb';

Или с явной транзакцией:

BEGIN TRANSACTION OutOfProc;

EXEC TransProc 1, 'aaa';

COMMIT TRANSACTION OutOfProc

Чего они не касаются, так это того, что происходит, когда хранимый продукт:

  • завершается с ошибкой, но транзакция остается запущенной
  • завершается с ошибкой, но транзакция не остается запущенной
  • обнаруживает ошибку, но продолжает выполнение с открытой транзакцией
  • обнаруживает ошибку, но продолжает выполнение с откатом транзакции

Нет:

  • SET XACT_ABORT ON
  • @@TRANCOUNT

где-нибудь в каноническом примере.

Если бы я не знал лучше, я бы подумал, что строка:

The following example shows the intended use of nested transactions.

на самом деле следует читать

The following example shows the how not to use nested transactions.

Разве кто-то может сделать орел или решку из этого примера BOL?

10
задан Ian Boyd 17 July 2012 в 21:47
поделиться