Wykonywanie procedury składowanej wewnątrz transakcji BEGIN/END
Jeśli utworzę procedurę składowaną w SQL i wywołam ją (EXEC spStoredProcedure
) w ramach transakcji BEGIN/END, czy ta inna procedura składowana również wchodzi do transakcji?
Nie wiedziałem, czy to działa jak try / catches w C#.
7 answers
Tak, Wszystko , co robisz między rozpoczęciem transakcji a zatwierdzeniem (lub wycofaniem), jest częścią transakcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:11:08
Brzmi świetnie, Wielkie dzięki. Skończyłem robiąc coś takiego (bo jestem na 05)
BEGIN TRY
BEGIN TRANSACTION
DO SOMETHING
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
-- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-09 01:05:34
Wierzę, że w MS SQL Server wykonanie procedury składowanej nastąpiłoby w ramach transakcji, ale bądź z tym bardzo ostrożny. Jeśli masz zagnieżdżone transakcje (tj. transakcję poza procedurą składowaną i inną transakcję wewnątrz procedury składowanej), wycofanie wpłynie na wszystkie transakcje, a nie tylko najbliższą transakcję.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:11:58
Jak wspomniał Chris, powinieneś uważać na cofnięcie transakcji.
Konkretnie to:
IF @@TRANCOUNT > 0 ROLLBACK
Nie zawsze tego chcesz. Możesz zrobić coś takiego
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
W ten sposób, wywołujący proc może sprawdzić wartość zwracaną z procedury składowanej i określić, czy chce zatwierdzić lub kontynuować bąbelkowanie błędu.
Powodem jest to, że 'COMMIT' po prostu zmniejszy twój licznik transakcji. Gdy już zdekoncentruje transakcja licznika do zera, wtedy nastąpi rzeczywisty commit.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 21:51:06
Jak wspomnieli Chris i James , Musisz być ostrożny podczas radzenia sobie z zagnieżdżonymi transakcjami. Istnieje zbiór bardzo dobrych artykułów na temat transakcji napisanych przez Don Peterson na SQL Server Central, polecam przeczytać te:
Tutaj są:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:33
Tak, wszystkie zagnieżdżone wywołania procedur składowanych są objęte zakresem transakcji. Jeśli używasz SQL Server 2005 lub nowszego, możesz użyć Try...Łap też. Tutaj jest więcej szczegółów na ten temat.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:14:53
@Chris, nie wiedziałem tego.
Podczas googlowania po więcej informacji natknąłem się na to - można ustawić 'savepoints', które można cofnąć bez cofania całej transakcji.
Może się przydać w tej sytuacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 22:23:14