2017-09-25 1 views
0

を必要としてコミット:のOracle SQL Developerの - >手動10で、シーケンスの増分を変える - 私は11gR2のに接続されているのOracle SQL Developerを使用して実行している場合>

10 BY ALTER SEQUENCE myCounterのINCREMENT。

このステートメントをコミットする必要がありますか。このステートメントを実行し、緑のコミットボタンを押す前にネットワーク接続が失われても、シーケンスは10だけインクリメントされますか?

私は完全に何Oracle writes in their documentation理解していない:それはDDLはなくDMLあるので、あなたのalter文はコミットする必要はありません When a sequence number is generated, the sequence is incremented, independent of the transaction committing or rolling back.

答えて

2

。接続を失っても効果はありません。しかし、それ自体でシーケンス値を増やすことはありません。それは何

は、シーケンスに定義ので、次の時間を変更し、後続のすべての時間、nextvalは、生成された番号ではなく、それが以前に設定したものは何でもより10でインクリメントされますと呼ばれている(デフォルトは1)。

ので、迅速なデモとして:

CREATE SEQUENCE myCounter; 

Sequence MYCOUNTER created. 

SELECT myCounter.nextval from dual; 

    NEXTVAL 
---------- 
     1 

SELECT myCounter.nextval from dual; 

    NEXTVAL 
---------- 
     2 

SELECT myCounter.nextval from dual; 

    NEXTVAL 
---------- 
     3 

ので、シーケンスは、デフォルトで、1ずつインクリメントされます。あなたはそれを変更した後に続いて、代わりに1の10によるnextval増加への各呼び出し:

ALTER SEQUENCE myCounter INCREMENT BY 10; 

Sequence MYCOUNTER altered. 

SELECT myCounter.nextval from dual; 

    NEXTVAL 
---------- 
     13 

SELECT myCounter.nextval from dual; 

    NEXTVAL 
---------- 
     23 

alter自体は使い切るか、10個の値をスキップしていなかった - そう最初nextvalは23ではなく13それを持っているでしょう定義を変更しただけです。

ドキュメントは、あなたがロールバックする場合は、あなたが再び発生した以前に発行された番号のいずれかを取得しないことを言っている参照してください:

ROLLBACK; 

Rollback complete. 

SELECT myCounter.nextval from dual; 

    NEXTVAL 
---------- 
     33 

あなたは再び33、いない23を取得します。値は発行され、ロールバックやコミットに関わらず、別の nextvalコールから取得するために、自分のものを含め、他のセッションでは使用できなくなります。 (シーケンスが cycleに設定されていると、最終的に再発行されることがありますが、デフォルトでは無効になります)。

シーケンスの生成はgaplessではなく、ロールバックの処理方法とキャッシュメカニズムの仕組みの両方のためではありません。この数字は、必ずしも順番に厳密に発行されるわけではありません.RAC環境では、各ノードに独自のキャッシュがあり、その中から割り当てます。

関連する問題