Подавление транзакции в хранимой процедуре

Я хочу знать, может быть, или нет, можно подавить транзакцию внутри хранимой процедуры SQL. У меня есть следующая ситуация в моем SP (чего я хочу достичь):

WHILE TRUE
BEGIN TRY
    BEGIN TRANSACTION A
    RECEIVE MESSAGE FROM SSB QUEUE WITH TIMEOUT

    BEGIN SUPPRESS TRANSACTION 
      WHILE RECORD IN TABLE
         BEGIN TRANSACTION B
           DELETE RECORD FROM TABLE OUTPUT RECORD INTO D
           SEND RECORD D TO OTHER SSB QUEUE
         COMMIT TRANSACTION B
    END SUPPRESS TRANSACTION
    COMMIT TRANSACTION A
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION A
END CATCH

поэтому я действительно хочу, чтобы транзакция B не включалась в транзакцию A:)

Ответы

Ответ 1

Вы описываете "автономную транзакцию", которая является распространенным вопросом у людей, которые переходят из Oracle (который их поддерживает) в MSSQL (а это не так). В этой статье объясняются различные варианты, которые, к сожалению, не особенно привлекательны:

  • Связанный с обратной связью сервер
  • Соединение с обратной связью из процедуры CLR
  • Табличная переменная, которая хранит данные, потому что на них не влияют откаты
  • Соединение с обратной связью из расширенной хранимой процедуры (но они все равно не рекомендуются для процедур CLR)

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