Das Ausführen einer gespeicherten Prozedur innerhalb BEGIN / END TRANSACTION
-
05-07-2019 - |
Frage
Wenn ich eine gespeicherte Prozedur in SQL und nenne es (EXEC spStoredProcedure
) innerhalb der BEGIN / END TRANSACTION erstellen, wird die andere gespeicherte Prozedur auch in die Transaktion fallen?
Ich wusste nicht, ob es so versuchen gearbeitet / Fänge in C #.
Lösung
Ja, alles , die Sie tun, zwischen dem Start der Transaktion und Commit (oder Rollback) ist Teil der Transaktion.
Andere Tipps
Hört sich gut an, dank einem Haufen. Ich landete so etwas wie dies zu tun (weil ich bin auf 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
Ich glaube, in MS SQL Server die gespeicherte Prozedur der Ausführung innerhalb der Transaktion geschehen würde, aber mit diesem sehr vorsichtig sein. Wenn Sie Transaktionen verschachtelt haben (dh Transaktion außerhalb der gespeicherten Prozedur und eine anderen Transaktion innerhalb der gespeicherten Prozedur), wird ein Rollback aller Transaktionen beeinflusst, nicht nur die nächste einschließende Transaktion.
Als Chris erwähnt, sollten Sie vorsichtig sein, über die Transaktion zurück rollen.
Insbesondere folgt aus:
IF @@TRANCOUNT > 0 ROLLBACK
ist nicht immer das, was Sie wollen. Man könnte so etwas tun
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
Auf diese Weise kann der Aufruf proc den Rückgabewert der gespeicherten Prozedur prüfen und festzustellen, ob es trotzdem begehen will oder weiterhin die Fehler zu sprudeln.
Der Grund dafür ist, dass ‚COMMIT‘ wird nur Ihre Transaktionszähler dekrementieren. Sobald es die Transaktionszähler auf Null dekrementiert, dann begehen eine tatsächliche auftreten.
Wie Chris und James erwähnt, müssen Sie vorsichtig sein, wenn mit verschachtelten Transaktionen zu tun. Es gibt eine Reihe eine sehr gute Artikel zum Thema Transaktionen geschrieben von Don Peterson SQL Server Centra l, würde ich empfehlen, gelesen von solchen mit:
Hier gibt es:
Ja, alle verschachtelten gespeicherte Prozeduraufrufe werden im Rahmen der Transaktion enthält. Wenn Sie SQL Server 2005 oder höher verwenden, können Sie versuchen, verwenden ... wie gut fangen. Hier ist mehr darüber zu.
@ Chris, ich wusste nicht, dass.
Wenn für weitere Informationen googeln, stieß ich auf dieser - Sie können ‚Savepoints‘ gesetzt, die wieder die gesamte Transaktion rückgängig gemacht werden können, ohne zurück~~POS=TRUNC.
kann in dieser Situation nützlich sein.