3

やなどの「基本操作」ストアド プロシージャがBookAVehicleありUnBookAVehicleます。どちらも取引中です。

しかし、今はもう少し複雑なストアド プロシージャが必要です: RescheduleBooking. また、トランザクショナルである必要があります。

ここで、内部からResceduleBookingを呼び出したいのですがBookAVehicle、この場合、内部トランザクションをロールバックさせたくありません。

しかし、BookAVehicle直接呼び出すときは、ロールバックを維持したいと思います。

これをエレガントに行う方法について何か提案はありますか?

パラメータとしてストアドプロシージャの名前を取り、トランザクションとパラメータストアドプロシージャへの呼び出しのみを含む「ラッパー」スト​​アドプロシージャを持つという行に沿って何かを考えていました。

したがって、「直接」と呼ぶときは、次のように呼び出します。

TransactionWrapper(BookAVehicleWithoutTrans)

そして、別のトランザクションから呼び出すと、次のように呼び出します。

RescheduleBooking -> BookAVehicleWithoutTrans
4

1 に答える 1

1

BEGIN TRANSACTION を実行すると、内部カウンターが @@TRANCOUNT ずつインクリメントされます。ROLLBACK TRANSACTION は、@@TRANCOUNT を 0 に設定するすべての BEGIN TRANSACTIONS をロールバックします。コミット トランザクションを実行すると、@@TRANCOUNT が減少するだけです。@@TRANCOUNT が 1 の場合は、0 に設定する前に完全なコミットが行われます。

そのことを念頭に置いて、Book および UnBook プロシージャで BEGIN および COMMIT TRANSACTIONS をペアにしたと仮定すると、RescheduleBooking プロシージャを次のように実行します。これにより、unbook が失敗した場合でも最初のブックが維持されます...

CREATE PROCEDURE RescheduleBooking ...
AS
BEGIN
      BEGIN TRY
         BEGIN TRANSACTION
         EXEC BookAVehicle ...
         COMMIT TRANSACTION
      END TRY
      BEGIN CATCH
         IF @@TRANCOUNT > 0
         BEGIN
             ROLLBACK TRANSACTION
         END
         RETURN
      END CATCH;

   -- If the unbook fails the booking above will still stay.
      BEGIN TRY
         BEGIN TRANSACTION
         EXEC UnBookAVehicle ...
         COMMIT TRANSACTION
      END TRY
      BEGIN CATCH
         IF @@TRANCOUNT > 0
         BEGIN
             ROLLBACK TRANSACTION
         END
         RETURN
      END CATCH;
END
于 2014-05-23T13:45:27.440 に答える