Подавить транзакцию в хранимой процедуре - PullRequest
11 голосов
/ 16 сентября 2010

Я хочу знать, возможно ли отключить транзакцию внутри хранимой процедуры 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 Ответ

10 голосов
/ 16 сентября 2010

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

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

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

...