Mam procedurę składowaną, która musi ustawić punkt zapisu, aby w pewnych okolicznościach mógł cofnąć wszystko, co zrobił i zwrócił kod błędu dzwoniącemu lub zaakceptuj/zatwierdz i zwróć sukces rozmówcy. Ale potrzebuję go do pracy, czy dzwoniący już rozpoczął transakcję, czy nie. Doktor jest niezmiernie zagmatwany na ten temat. Oto, co moim zdaniem zadziała, ale nie jestem pewien wszystkich konsekwencji. To jest - Stored Procedure (SP)
jest wywoływana przez innych. Nie wiem, czy rozpoczęli transakcję, czy nie ... Nawet jeśli wymagam od użytkowników rozpoczęcia transakcji, aby użyć mojego SP, nadal mam pytania dotyczące prawidłowego korzystania z usługi Save Points
...ZAPISZ TRANSAKCJĘ vs BEGIN TRANSAKCJĘ (SQL Server), jak ładnie zagnieździć transakcje
Moje SP przetestuje, czy transakcja jest w toku, a jeśli nie, uruchom ją przy pomocy BEGIN TRANSACTION
. Jeśli transakcja jest już w toku, utworzy punkt zapisu z numerem SAVE TRANSACTION MySavePointName
i zapisze fakt, że właśnie to zrobiłem.
Następnie, jeśli muszę wycofać moje zmiany, jeśli wcześniej zrobiłem BEGIN TRANSACTION
, będę ROLLBACK TRANSACTION
. Jeśli zrobiłem punkt zapisu, to będę ROLLBACK TRANSACTION MySavePointName
. Ten scenariusz wydaje się działać świetnie.
Tutaj się trochę zmieszam - jeśli chcę zachować pracę, którą wykonałem, jeśli rozpocznę transakcję, wykonam COMMIT TRANSACTION
. Ale jeśli stworzyłem punkt zapisu? Próbowałem COMMIT TRANSACTION MySavePointName
, ale wtedy rozmówca próbuje popełnić swoją transakcję i dostaje błąd:
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
Więc zastanawiam następnie - punkt zaoszczędzić można wycofać (to działa: ROLLBACK TRANSACTION MySavePointName
nie przywróci rozmówcy transakcja). Ale może nigdy nie trzeba tego "popełniać"? Pozostaje tam tylko na wypadek, gdybyś musiał wrócić do niego, ale odejdzie, gdy pierwotna transakcja zostanie zatwierdzona (lub wycofana)?
Jeśli istnieje "lepszy" sposób "zagnieżdżenia" transakcji, proszę rzucić trochę światła. Nie zorientowałem się, jak zagnieżdżać z BEGIN TRANSACTION
, ale tylko wycofać lub zatwierdzić moją wewnętrzną transakcję. Wydaje się, że ROLLBACK
zawsze wycofa się do najwyższej transakcji, podczas gdy COMMIT
po prostu dekretyje @@trancount
.
Twój znalezisko może być warta opublikowania jako odpowiedź. –
@Andriy Ok, to właśnie zrobiłem - usunąłem moją edycję i użyłem jej zamiast odpowiedzi. Dzięki. –