Подтвердить что ты не робот

Выполнение хранимой процедуры внутри BEGIN/END TRANSACTION

Если я создаю хранимую процедуру в SQL и вызываю ее (EXEC spStoredProcedure) в BEGIN/END TRANSACTION, эта другая хранимая процедура также попадает в транзакцию?

Я не знал, работает ли это как try/catch на С#.

4b9b3361

Ответ 1

Да, все, что вы делаете между Begin Transaction и Commit (или откатом), является частью транзакции.

Ответ 2

Звучит здорово, благодаря кучу. Я закончил делать что-то вроде этого (потому что я на 05)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH

Ответ 3

Я считаю, что в MS SQL Server выполнение хранимой процедуры произойдет в транзакции, но будьте очень осторожны с этим. Если у вас есть вложенные транзакции (т.е. Транзакция за пределами хранимой процедуры и другая транзакция внутри хранимой процедуры), откат будет влиять на ВСЕ транзакции, а не только на ближайшую заключенную транзакцию.

Ответ 4

Как сказал Крис, вы должны быть осторожны в том, чтобы вернуть транзакцию назад.

В частности это:

IF @@TRANCOUNT > 0 ROLLBACK

не всегда то, что вы хотите. Вы могли бы сделать что-то вроде этого

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

Таким образом, вызывающий процесс может проверять возвращаемое значение из хранимой процедуры и определять, хочет ли он в любой момент совершить фиксацию или продолжить всплывать ошибку.

Причина в том, что "COMMIT" просто уменьшит ваш счетчик транзакций. Когда он уменьшит счетчик транзакций до нуля, произойдет фактическое фиксация.

Ответ 5

Да, все вложенные вызовы хранимых процедур включены в объем транзакции. Если вы используете SQL Server 2005 или выше, вы можете использовать Try... Catch. Здесь более подробно об этом.

Ответ 6

@Крис, я этого не знал.

При поиске в Google для получения дополнительной информации я наткнулся на this - вы можете установить "точки сохранения", которые можно отбросить обратно, всей транзакции.

Может быть полезно в этой ситуации.