こんにちは、私のサイトで製品やその他のものを作成するためのストアドプロシージャを入手しました。今、私はそれらのいくつかをトランザクションで実行しなければなりません。それは可能ですか、またはトランザクション専用のストアドプロシージャを作成する必要がありますか?
次のように言えますか
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#コードで更新します(個人的には、トランスコードをsprocから除外したり、データレイヤーに保存したりするのがはるかに簡単だと感じています。後の段階でストアドプロシージャを簡単に作成できます)。
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を実行する必要があるかどうかを確認できます。
編集:リターンコードを確認するには、次のようなことができます。これにより、最初のストアドプロシージャが実行されます。 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
Begin TRAN
BEGIN TRY
-- your Action
Commit TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH