1

実際、ストアド プロシージャでネストされたトランザクションを使用することについて、少し混乱しました。1 つのメイン プロシージャで 2 つまたは 3 つのプロシージャを呼び出す必要があります。

例えば:

Begin try

Begin Tran -- 1st level transcation

Procedure 1 --will be executed

Procedure 2 --will be executed

End tran -- 1st level transcation
End try
Begin Catch
Rollback tran
End Catch


PROCEDURE 1:

BEGIN TRAN TRAN1
///scripts
COMMIT TRAN TRAN1


PROCEDURE 2:

BEGIN TRAN TRAN2
///scripts
COMMIT TRAN TRAN2

私は正しい方法でそれをやっていますか?

4

4 に答える 4

0

内部トランザクションのコミットは、SQL Server データベース エンジンによって無視されます。トランザクションは、最も外側のトランザクションの最後に実行されたアクションに基づいて、コミットまたはロールバックされます。外側のトランザクションがコミットされると、内側のネストされたトランザクションもコミットされます。外部トランザクションがロールバックされると、内部トランザクションが個別にコミットされたかどうかに関係なく、すべての内部トランザクションもロールバックされます。

リンクを参照してください https://technet.microsoft.com/en-us/library/ms189336%28v=sql.105%29.aspx

于 2016-05-31T09:28:47.790 に答える
0

BEGIN TRANSACTION => @@TRANCOUNT = @@TRANCOUNT + 1
COMMIT TRANSACTION => @@TRANCOUNT = @@TRANCOUNT - 1 (変更を保存する 0 の場合)
ROLLBACK TRANSACTION => @@TRANCOUNT = 0 (変更を破棄)

あなたの外側の手順では、

BEGIN TRY
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
    ..
END TRY
于 2016-05-31T11:52:32.833 に答える
0

ネストされたトランザクションなどはありません。トランザクションの一部だけをロールバックする場合は、savepointsを使用する必要があります。セーブポイントに関して、 afterCOMMIT TRANSACTION SavepointNameが実行されるとROLLBACK、この最後のROLLBACKステートメントは、セーブポイントで定義されたセクションを含むすべてをロールバックします。

BEGIN TRANSACTION -- A

SAVE TRANSACTION SavePoint1 -- B
-- do something
COMMIT TRANSACTION SavePoint1 -- C

-- ...
-- This ROLLBACK will rollback everything including data committed for SavePoint1 - it will rollback also actions for [B,C] range
ROLLBACK -- D

セーブポイントを使用する場合は、ここから次のテンプレートを使用します(セクションを参照Example)。

于 2016-05-31T11:46:05.613 に答える