25

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

私は次のようなことを言うことができます

BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
4

4 に答える 4

52

上記の他の回答に追加するには、エラー処理を追加することをお勧めします。

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;
   }
}
于 2012-08-20T06:53:29.980 に答える
3

はい、ストアド プロシージャはトランザクション内で実行できます。サンプル クエリを以下に示します。

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
于 2012-08-20T06:18:05.093 に答える
2

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
于 2012-08-20T06:17:40.390 に答える