ストアドプロシージャを使用してセーブポイントを設定する必要があるため、特定の状況ではすべての処理を取り消して呼び出し元にエラーコードを返すことができますそれを受け入れてコミットし、呼び出し元に成功を返します。しかし、私はそれが呼び出し側が既にトランザクションを開始したかどうかにかかわらず動作する必要があります。この主題は非常に混乱しています。ここで私はうまくいくと思うが、私はすべての分派の特定ではない。SAVE TRANSACTIONとBEGIN TRANSACTION(SQL Server)トランザクションをうまくネストする方法
事は - このStored Procedure (SP)
は他人から呼ばれています。だから私は彼らがトランザクションを開始したかどうかわからない...ユーザーが私のSPを使用するトランザクションを開始する必要があっても、私はまだSave Points
の適切な使用について質問があります...
私SPはトランザクションが進行中かどうかをテストし、そうでない場合はBEGIN TRANSACTION
で開始します。トランザクションがすでに進行中の場合は、代わりにSAVE TRANSACTION MySavePointName
でセーブポイントを作成し、これが私が行ったことを保存します。
変更を元に戻す必要がある場合は、BEGIN TRANSACTION
を先に実行した場合、ROLLBACK TRANSACTION
となります。私がセーブポイントをしたら、ROLLBACK TRANSACTION MySavePointName
になるでしょう。このシナリオは素晴らしいと思われる。
ここで私はちょっと混乱しています。私がやった仕事を続けたいのであれば、取引を始めたらCOMMIT TRANSACTION
を実行します。しかし、もし私がセーブポイントを作ったら?私はCOMMIT TRANSACTION MySavePointName
を試してみましたが、その後、発信者は、そのトランザクションをコミットしようとするとエラーを取得:だから
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
私は、思ったんだけど - セーブポイントがロールバックすることができます(動作します:ROLLBACK TRANSACTION MySavePointName
は、発信者のロールバックしませんがトランザクション)。しかし、おそらく誰もそれを「コミット」する必要はありませんか?元のトランザクションがコミット(またはロールバック)されると、ロールバックする必要がある場合に備えてそこにとどまります。
トランザクションを「入れ子にする」「より良い」方法がある場合は、同様にいくつかの光を放棄してください。 BEGIN TRANSACTION
をネストする方法はわかっていませんが、内部的なトランザクションをロールバックまたはコミットするだけです。 ROLLBACK
は常にトップトランザクションにロールバックし、COMMIT
は単に@@trancount
をデクリメントします。
あなたの発見は答えとして掲載する価値があるかもしれません。 –
@Andriy Ok、それは私がやったことです - 私の編集を削除し、代わりに答えとしてそれを使用しました。ありがとう。 –