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#.

Author: CDspace, 2008-10-07

7 answers

Tak, Wszystko , co robisz między rozpoczęciem transakcji a zatwierdzeniem (lub wycofaniem), jest częścią transakcji.

 36
Author: Blorgbeard,
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
 11
Author: Miles,
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ę.

 5
Author: Chris Shaffer,
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.

 5
Author: James,
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ą:

 2
Author: kristof,
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.

 1
Author: Ben Hoffstein,
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.

 1
Author: Blorgbeard,
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