3

SQL Server 2012 シーケンス オブジェクトがあります。

/****** Create Sequence Object ******/
CREATE SEQUENCE TestSeq
START WITH 1
INCREMENT BY 1;

トランザクション内でいくつかのクエリを実行する SP があります。

BEGIN TRAN

SELECT NEXT VALUE FOR dbo.TestSeq

<here all the query update code......>

ROLLBACK TRAN

トランザクションが失敗した場合、すべての更新は問題なくロールバックされますが、トランザクションの範囲外であるため、シーケンスはロールバックされません。

それを処理する方法の手がかりはありますか?

4

2 に答える 2

1

すべてのシーケンス番号を格納するテーブルを宣言してから、以下のようなステートメントを使用します。

@SequenceNo int を宣言する

    UPDATE MySequenceNumberTable
    SET @SequenceNo = SequenceNo = SequenceNo + 1
    WHERE SequenceName = 'Your sequence name'

ここでは、単一のステートメントが値をインクリメントし、変数に代入し、DB テーブルを更新するため、アトミック アクションが保証されます。単純な DB 更新操作であるため、DB トランザクション内で役割を果たします。トランザクションがロールバックされた場合、SequenceNo フィールドの値は以前の値に戻されます。

行レベルのロックのため、最初のトランザクションがコミットまたはロールバックされるまで待機する必要があるのは、同じシーケンス名の次の値を必要とする次のトランザクションのみです。DB シーケンスの場合、シーケンスのロックがないため、次の値を必要とする他のトランザクションをブロックすることはありません。

私たちの場合、単純に穴をあけることができず、同時実行保護が必要なので、上記の方法を使用するとうまく機能します。

于 2015-07-21T10:26:24.997 に答える
-4

ROLLBACK ステートメントを次のように使用して、トランザクション全体をキャンセルします。

BEGIN TRANSACTION
...
SQL Statement(s)

...
ROLLBACK TRANSACTION

ROLLBACK コマンドを使用して、次の方法でトランザクションの一部をキャンセルすることもできます。

BEGIN TRANSACTION
...
SQL Statement(s)

SAVE TRANSACTION savepoint_name

SQL Statement(s)

ROLLBACK TRANSACTION savepoint_name
于 2012-09-08T09:35:26.770 に答える