要するに、配列はあなたが探しているプロパティを持っています。
今や少し理由があります。それらのベースでは、シーケンスはシステム・テーブル内の単なる行にすぎず、シーケンス内の現在の値を表す列があります。通常、NEXT VALUE FOR
を呼び出すと、SQL Serverはその現在の値をフェッチし、その値を1だけインクリメントし、最後にフェッチされた値を返します。 sp_sequence_get_range
を使用すると、要求した範囲のサイズで値をインクリメントする点を除いて同じことが行われます(例:@range_size = 10
で呼び出すと、値が10ずつ増えます)。
私が不思議に思っていたことの1つは、sp_sequence_get_range
プロシージャコールを含むトランザクションのロールバックによっても、その範囲の割り当てがロールバックされたかどうかでした。私はそれがそうでないことを報告することを嬉しく思う。したがって、そのプロシージャへの2つの呼び出しが同じ値を持つことを心配する必要はありません。
最後に、ギャップレスシーケンスの誤謬に対して注意します。範囲を取得してそのスレッドが何らかの理由で死んだ場合(たとえば、アプリケーションが終了すると、SQL Serverが予期せずシャットダウンする)、そのシーケンスは永遠に失われます。つまり、次の範囲の呼び出しがその範囲になるように、「未使用」の範囲をキューに戻すことはありません。
「すべて」または「何もない」の「原子」ですか?あなたはどんな部分的なことを期待していますか? –
私は、シーケンスへの同時アクセスによって生じる可能性のあるギャップなしに連続番号が必要であることを意味します。たとえば、2つのプロセスが値0のシーケンスから10個の数値を同時に要求した場合、それらは常にギャップ[0-9]と[10-19]を取得します。 – astef