Hallo, ich habe einige gespeicherte Prozeduren erhalten, um Produkte und anderes auf meiner Website zu erstellen. Jetzt muss ich einige davon in einer Transaktion ausführen. Ist das möglich oder muss ich nur für die Transaktion eine gespeicherte Prozedur erstellen?
Kann ich sowas sagen?
BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
Um zu den anderen Antworten oben hinzuzufügen, möchten Sie möglicherweise einige Fehlerbehandlung hinzufügen:
BEGIN TRAN
BEGIN TRY
EXEC P1
EXEC P2
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
Update mit C # -Code (Ich persönlich finde es viel einfacher, Transcode außerhalb der Sprocs und in der Datenschicht zu halten - erleichtert das Erstellen gespeicherter Prozeduren später)
using (var conn = new SqlConnection(...))
trans = conn.BeginTransaction();
try
{
...call P1 using transaction
...call P2 using transaction
trans.Commit();
}
catch
{
trans.RollBack();
throw;
}
}
Ja, eine gespeicherte Prozedur kann innerhalb einer Transaktion ausgeführt werden. Nachfolgend finden Sie eine Beispielanfrage.
create table temp1
(
id int,
name varchar(20)
)
create table temp2
(
id int,
name varchar(20)
)
go
create proc p1 as
insert temp1 values (1, 'test1')
create proc p2 as
insert temp2 values (1, 'test2')
go
begin tran tx
exec p1
exec p2
commit
In SQL Server (nicht sicher über andere RDBMS) können Sie mehrere gespeicherte Prozeduren in einer Transaktion aufrufen.
BEGIN TRAN
EXEC StoredProc1
EXEC StoredProc2
COMMIT TRAN
Sie können der gespeicherten Prozedur einen Rückkehrcode hinzufügen, um zu prüfen, ob die gespeicherte Prozedur 2 ausgeführt werden soll, falls die gespeicherte Prozedur 1 fehlgeschlagen ist
BEARBEITEN: Um einen Rückkehrcode zu überprüfen, können Sie Folgendes tun. Dadurch wird die erste gespeicherte Prozedur ausgeführt. Wenn es 0 zurückgibt, läuft es die 2.. Wenn der 2. Wert 0 ergibt, wird die Transaktion festgeschrieben. Wenn keiner von 0 zurückgegeben wird, wird die Transaktion rückgängig gemacht
DECLARE @ReturnValue INT
BEGIN TRAN
EXEC @ReturnValue = StoredProc1
IF @ReturnValue = 0
BEGIN
EXEC @ReturnValue = StoredProc2
IF @ReturnValue = 0
BEGIN
COMMIT
END
ELSE
BEGIN
ROLLBACK
END
END
ELSE
BEGIN
ROLLBACK
END
Begin TRAN
BEGIN TRY
-- your Action
Commit TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH