3

シーケンスが複数のユーザーによって同時に (ミリ秒単位でも) アクセスされた場合はどうなりますか。デッドロックになるのか、オラクルには何らかのメカニズムがあるのか​​?

つまり、A と B のユーザーが同時に要求した場合nextval、同じ値を取得するか、ハングします。squence1

このブログによると、

シーケンスでの NextVal の同時アクセスは、常に各呼び出し元に個別の値を返します。(シーケンスが値を循環するように設定されている場合を除きます。この場合、値が重複する可能性があります)。

4

1 に答える 1

8

Jonathan Lewis は、彼の著書 Oracle Core (pp.222-225) でこれを取り上げています。すべてを要約するつもりはありません。本を購入してください (ここで見つけてください)。重要なことは、彼が何が起こっているかを説明するだけでなく、何が起こっているかを (SQL トレースを使用して) 確認する方法を示してくれることです。

基本的に、各シーケンスはコア テーブルの単なる行seq$です。を最初に呼び出すとnextval、そのシーケンスのエントリが更新されます。これにより、シーケンスのハイウォーター マークが開始値 + キャッシュ値にインクリメントされます。nextvalデータベースは、SGAの現在の値 (開始値 + への呼び出し数) を追跡します。その数がハイウォーター マークに達すると、データベースがseq$再び更新されます。

注意すべき重要なことは、これらすべてが個々のセッションではなく SGA で管理されるということです。nextval個々のセッションが追跡するのは、 への後続の呼び出しを満たすことができるように、への最新の呼び出しの結果だけですcurrval

于 2013-05-05T10:03:10.907 に答える