web-dev-qa-db-ja.com

SQL Server:ストアドプロシージャトランザクション

こんにちは、私のサイトで製品やその他のものを作成するためのストアドプロシージャを入手しました。今、私はそれらのいくつかをトランザクションで実行しなければなりません。それは可能ですか、またはトランザクション専用のストアドプロシージャを作成する必要がありますか?

次のように言えますか

BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
21
saadan

上記の他の回答に追加するには、いくつかのエラー処理を追加できます。

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;
   }
}
41
Paddy

はい、トランザクション内でストアドプロシージャを実行できます。以下のサンプルクエリをご覧ください。

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
3
aravind

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
2
Greg
Begin TRAN
BEGIN TRY
  -- your Action
  Commit TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
  BEGIN
    ROLLBACK TRAN
  END 
END CATCH
1
fstephenster