こんにちは、自分のサイトで製品やその他のものを作成するためのストアドプロシージャをいくつか入手しました。今、私はそれらのいくつかをトランザクションで実行する必要があります。それは可能ですか、それともトランザクション専用のストアドプロシージャを作成する必要がありますか?
私は次のようなことを言うことができます
BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
こんにちは、自分のサイトで製品やその他のものを作成するためのストアドプロシージャをいくつか入手しました。今、私はそれらのいくつかをトランザクションで実行する必要があります。それは可能ですか、それともトランザクション専用のストアドプロシージャを作成する必要がありますか?
私は次のようなことを言うことができます
BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
上記の他の回答に追加するには、エラー処理を追加することをお勧めします。
BEGIN TRAN
BEGIN TRY
EXEC P1
EXEC P2
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
C# コードで更新します (個人的には、トランス コードを sprocs から外してデータ層に保持する方がはるかに簡単だと思います - 後の段階でストアド プロシージャを簡単に作成できます)。
using (var conn = new SqlConnection(...))
trans = conn.BeginTransaction();
try
{
...call P1 using transaction
...call P2 using transaction
trans.Commit();
}
catch
{
trans.RollBack();
throw;
}
}
はい、ストアド プロシージャはトランザクション内で実行できます。サンプル クエリを以下に示します。
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
SQL Server (他の RDBMS については不明) から、トランザクション内で複数のストアド プロシージャを呼び出すことができます。
BEGIN TRAN
EXEC StoredProc1
EXEC StoredProc2
COMMIT TRAN
ストアド プロシージャにリターン コードを追加して、ストアド プロシージャ 1 が失敗した場合にストアド プロシージャ 2 を実行する必要があるかどうかを確認することができます。
EDIT:リターンコードを確認するには、次のようなことができます。これにより、最初のストアド プロシージャが実行されます。0 を返すと、2 番目が実行されます。2 番目が 0 を返す場合、トランザクションをコミットします。どちらかが 0 以外を返した場合、トランザクションをロールバックします。
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