2016-04-04 15 views
0

私はシーケンスを持っています。私はそれからいくつかの連続した値を原子的に取り出したいと思っています。シーケンスを配列から取得する

私が知る限り、シーケンスはトランザクションをサポートしていません。

標準NEXT VALUE FORsyntax他のデータベースでは、そうすることができますが、助けてください。

私が見つけたのはsp_sequence_get_rangefunctionですが、原子であるかどうかはわかりません。そのようなケースをテストすることは非常に難しいです。

可能ですか?

+0

「すべて」または「何もない」の「原子」ですか?あなたはどんな部分的なことを期待していますか? –

+0

私は、シーケンスへの同時アクセスによって生じる可能性のあるギャップなしに連続番号が必要であることを意味します。たとえば、2つのプロセスが値0のシーケンスから10個の数値を同時に要求した場合、それらは常にギャップ[0-9]と[10-19]を取得します。 – astef

答えて

2

要するに、配列はあなたが探しているプロパティを持っています。

今や少し理由があります。それらのベースでは、シーケンスはシステム・テーブル内の単なる行にすぎず、シーケンス内の現在の値を表す列があります。通常、NEXT VALUE FORを呼び出すと、SQL Serverはその現在の値をフェッチし、その値を1だけインクリメントし、最後にフェッチされた値を返します。 sp_sequence_get_rangeを使用すると、要求した範囲のサイズで値をインクリメントする点を除いて同じことが行われます(例:@range_size = 10で呼び出すと、値が10ずつ増えます)。

私が不思議に思っていたことの1つは、sp_sequence_get_rangeプロシージャコールを含むトランザクションのロールバックによっても、その範囲の割り当てがロールバックされたかどうかでした。私はそれがそうでないことを報告することを嬉しく思う。したがって、そのプロシージャへの2つの呼び出しが同じ値を持つことを心配する必要はありません。

最後に、ギャップレスシーケンスの誤謬に対して注意します。範囲を取得してそのスレッドが何らかの理由で死んだ場合(たとえば、アプリケーションが終了すると、SQL Serverが予期せずシャットダウンする)、そのシーケンスは永遠に失われます。つまり、次の範囲の呼び出しがその範囲になるように、「未使用」の範囲をキューに戻すことはありません。