11

Chcę wiedzieć, czy nie można ukryć transakcji wewnątrz procedury składowanej SQL. Mam następującą sytuację w moim SP (które chcę osiągnąć):Tłumienie transakcji w procedurze przechowywanej

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 

więc to, co naprawdę chcesz robić to, że transakcja B nie zostanie wpisany transakcja A :)

+0

Dobrze, panie poruczniku, właśnie napisałem to ... i wygląda na to, że pracowaliśmy nad bardzo podobnym problemem z waszym kodem :) – amarsuperstar

Odpowiedz

10

jesteś opisująca "transakcję autonomiczną", która jest częstym pytaniem od osób migrujących z Oracle (która je obsługuje) do MSSQL (która nie). This article opisuje różne opcje, które niestety nie są szczególnie atrakcyjne:

  1. pętli zwrotnej serwer połączony
  2. Połączenie sprzężenia zwrotnego z procedury CLR
  3. zmiennej tabela przechowująca dane, ponieważ nie są one dotknięte przez cofanie
  4. połączenie sprzężenia zwrotnego z procedury wbudowanej (ale nie są już używane i tak za procedur CLR)

Jeżeli żaden o Jeśli te opcje są dla Ciebie praktyczne, alternatywą jest przeniesienie pewnej kontroli do aplikacji i bazy danych, ale to oczywiście przesuwa problem do innej lokalizacji. Mimo to może być warte rozważenia.

Powiązane problemy