49

SQL でストアド プロシージャを作成し、それを ( EXEC spStoredProcedure) BEGIN/END TRANSACTION 内で呼び出した場合、この他のストアド プロシージャもトランザクションに含まれますか?

C# の try/catch のように機能するかどうかはわかりませんでした。

4

7 に答える 7

50

はい、Begin Transaction と Commit (または Rollback) の間に行うことはすべてトランザクションの一部です。

于 2008-10-07T20:11:08.053 に答える
14

いいですね、ありがとうございます。私はこのようなことをしてしまいました(私は05にいるので)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
于 2008-10-07T20:16:45.797 に答える
6

Chris が述べたように、トランザクションのロールバックには注意が必要です。

具体的にはこれ:

IF @@TRANCOUNT > 0 ROLLBACK

常にあなたが望むものではありません。あなたはこのようなことをすることができます

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

このようにして、呼び出し元のプロシージャは、ストアド プロシージャからの戻り値を検査し、とにかくコミットするか、エラーをバブルアップし続けるかを判断できます。

その理由は、'COMMIT' はトランザクション カウンターを減分するだけだからです。トランザクション カウンターがゼロになると、実際のコミットが発生します。

于 2008-10-07T20:42:08.863 に答える
6

MS SQL Server では、ストアド プロシージャの実行はトランザクション内で行われると思いますが、これには十分注意してください。ネストされたトランザクション (つまり、ストアド プロシージャの外側のトランザクションとストアド プロシージャの内側の別のトランザクション) がある場合、ロールバックは、最も近い外側のトランザクションだけでなく、すべてのトランザクションに影響します。

于 2008-10-07T20:11:58.207 に答える
3

ChrisJamesが述べたように、ネストされたトランザクションを扱うときは注意が必要です。SQL Server CentralDon Petersonによって書かれたトランザクションの主題に関する一連の非常に優れた記事があります。それらを読むことをお勧めします。

ここにあります:

于 2008-10-08T08:57:57.117 に答える
1

@クリス、私はそれを知りませんでした。

詳細をグーグルで調べていると、これに出くわしました-トランザクション全体をロールバックせずにロールバックできる「セーブポイント」を設定できます。

このような状況で役立つ可能性があります。

于 2008-10-07T22:23:14.247 に答える
1

はい、ネストされたストアド プロシージャの呼び出しはすべて、トランザクションのスコープに含まれます。SQL Server 2005 以降を使用している場合は、Try...Catch も使用できます。 ここにその詳細があります。

于 2008-10-07T20:14:53.163 に答える