1

デフォルトの分離レベル: READ COMMITTED を使用すると、次のプロシージャはセッションごとに異なる数値を返すことが保証されますか? 基本的に、あるセッションが別のセッションと同時にこのプロシージャを実行し、同じ値を返すことは可能ですか。

CREATE PROCEDURE GetNextVersion(@id uniqueidentifier)
AS
BEGIN
    UPDATE MySequenceTable
        SET mySequenceField = mySequenceField + 1 
    OUTPUT INSERTED.mySequenceField
    where IdField = @id
END
GO

注: SQL Server 2012 で新しいシーケンス オブジェクトを使用することはできません。また、これは ID 列が機能するシナリオでもありません。

4

1 に答える 1

1

出力句を使用せずに 1 つのステートメントで値を取得および設定すると、分離レベルに関係なく一意になります (エラーがないと仮定します)。

CREATE PROCEDURE GetNextVersion
@id uniqueidentifier,
@mySequenceField int output
AS
BEGIN
UPDATE MySequenceTable
SET @mySequenceField = mySequenceField,  mySequenceField + 1 
where IdField = @id
END
GO

変数が最初に更新されるため、テーブルには次のシーケンス値がすでにインクリメントされたままになっていることに注意してください。

また、where句にIDがあるのはなぜですか?MySequenceTable に行が 1 つしかない場合、これはうまく機能しませんか?

于 2012-12-10T19:00:21.850 に答える