[MsSQL] czy w procedurach wymagane są transakcje


(Uzi123) #1

Czy napisana przeze mnie procedura jest dla MsSQL jest jednym poleceniem, czy należy jeszcze w samej procedurze umieścić transakcje :?:

Dla przykładu

Mam 3 polecenia (dajmy na to UPDATE) w procedurze, drugie wykona się z błędem (nie wykona się) to co będzie w efekcie w bazie danych :?:

Czy jak ktoś zacznie wykonywać w tym samym czasie tą samą procedurę to może możliwe jest wymieszanie poleceń: np (1moj,1jego,2moj,2jego,3moj,3jego), czy tak jak bym oczekiwał czyli (1moj, 2moj, 3moj; 1jego, 2jego, 3jego) :?:


(somekind) #2

Każde jedno polecenie jest niejawnie pakowane w transakcję, natomiast oddzielne polecenia nie. Jeśli chcesz osiągnąć taki efekt, żeby np. po błędnym wykonaniu drugiego UPDATE zostały cofnięte wszystkie zmiany musisz wymusić transakcję jawnie i wszystkie swoje polecenia w niej umieścić.

Poczytaj o BEGIN TRANSACTION http://msdn.microsoft.com/en-us/library/ms188929.aspx, a także o COMMIT i ROLLBACK.


([alex]) #3

Jeżeli nie otoczysz tych UPDATE rozpoczęciem transakcji i jej zakończeniem oraz wycofaniem w razie błędu to będą cuda:

  1. Możliwe wymieszanie poleceń

  2. Możliwe częściowe wykonanie nie koniecznie kilka pierwszych.


(Uzi123) #4

OK. Dziekuje. Pomogło. :smiley:

Wypreparowałem coś takiego: czy jest to dobre rozwiązanie czy coś lepszego znacie?

BEGIN TRAN

BEGIN TRY

   polecenia.....

END TRY

BEGIN CATCH

IF @@TRANCOUNT > 0

ROLLBACK TRAN

END CATCH

IF @@TRANCOUNT > 0

COMMIT TRAN

([alex]) #5

Nie rozumiem poco ci te if'y?


(Uzi123) #6

Miało to być możliwie najogólniejsze jak się da. Pierwszy if jest po to, aby jak przypadkiem cofnę trans w miejscu polecenia to nie cofać jej jeszcze raz. Drugi if jest dla tego, że ten fragment kodu wykonuje się zawsze (niezależnie od tego czy jest błąd, czy go nie ma) więc nie fajnie by było jak bym zatwierdzał zamkniętą już transakcje.

Przynajmniej mi się wydaje, że tak powinno być dobrze.