- PR -

Oracle の SEQUENCE がうまく利用できない

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-16 17:07
Database Expert に書こうか迷ったのですが、現象は「ASP.NET(VB.NET)」を利用して発生しているため、こちらに記載することにしました。

現象を発生させる方法を特定できておりませんので、情報が足りないかもしれません。その場合、ご指摘いただけると助かります。

ASP.NET で、Oracle の SEQUENCE を取得しています。
通常、1 → 2 → 3 と続いていきますが、ある時、何故か 21 とか 41 に飛んだりします。

CACHE SIZE が「20」で設定してありますので、「21」や「41」に飛ぶのだと思います。
ただ、どうしてイキナリ飛んでしまうかが分からず、困っております。
どなたか同じような現象を見たり、聞いたりした方は居ないでしょうか?

シーケンスが飛んだ処理を再度実行すると、今度は正しく連番になったりしますので、処理には問題ないのでは、と考えております。
また、テスト環境ですので、自分以外にシーケンスを更新する人はおりません。

ちなみに、シーケンスは以下のように取得しています。
コード:
select シーケンス名.NEXTVAL as seqno from dual



また、シーケンスは以下のように作成しています。
コード:
CREATE SEQUENCE シーケンス名
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999
CYCLE;



・WindowsXP Pro SP2
・Oracle10g Standard Edition
・VS.NET2003
・.NET Framework1.1

よろしくお願い致します。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-16 17:27
引用:

ひろれいさんの書き込み (2006-05-16 17:07) より:

・Oracle10g Standard Edition


Oracle 10g ということですが RAC 環境ですか?
RAC の場合は Sequence は各サーバがキャッシュするので
そういう動きになるかもしれません。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-16 17:36
引用:

かるあさんの書き込み (2006-05-16 17:27) より:

Oracle 10g ということですが RAC 環境ですか?
RAC の場合は Sequence は各サーバがキャッシュするので
そういう動きになるかもしれません。


かるあさん、お返事ありがとうございます。

残念ながら、RAC(Real Application Clusters)環境ではありません。
<RAC の理解、合ってますよね・・・>
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-16 17:50
シーケンスについてまとめられているページがありました。
http://biz.rivus.jp/technote507125.html

またここも参考になるかも
http://blog.goo.ne.jp/btblog.php

今回の場合はシーケンスのキャッシュが破棄されて
新しくキャッシュされたので起こっているようです。

で、キャッシュの破棄のタイミングについては
わかりませんということでした。

どこかに文書あるのかも・・・
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-05-17 06:56
コネクション毎にキャッシュされるんじゃなかったっけ?コネクションプールを使っているなら、前回使ったコネクションと、今回使ったコネクションは必ずしも同じものではないですよね。当然、21や41になる場合もあるでしょう。

飛び番が発生したり、必ずしも順番どおりにならないのがSEQUENCEの仕様です。もしそれでは困ると言うのであれば、別の方法を考えてください。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-17 07:19
引用:

甕星さんの書き込み (2006-05-17 06:56) より:

コネクション毎にキャッシュされるんじゃなかったっけ?コネクションプールを使っているなら、前回使ったコネクションと、今回使ったコネクションは必ずしも同じものではないですよね。当然、21や41になる場合もあるでしょう。


コネクション毎では無いと思いますよ。
キャッシュ20で100セッションがキャッシュしたら
それだけでシーケンスが2000消費されてしまいます。
(一度キャッシュされたら戻らないので)

引用:

飛び番が発生したり、必ずしも順番どおりにならないのがSEQUENCEの仕様です。もしそれでは困ると言うのであれば、別の方法を考えてください。


これはその通りですね
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-17 09:20
引用:

かるあさんの書き込み (2006-05-17 07:19) より:
引用:

甕星さんの書き込み (2006-05-17 06:56) より:

コネクション毎にキャッシュされるんじゃなかったっけ?コネクションプールを使っているなら、前回使ったコネクションと、今回使ったコネクションは必ずしも同じものではないですよね。当然、21や41になる場合もあるでしょう。


コネクション毎では無いと思いますよ。
キャッシュ20で100セッションがキャッシュしたら
それだけでシーケンスが2000消費されてしまいます。
(一度キャッシュされたら戻らないので)


かるあさん、甕星さん、お返事ありがとうございます。

どうも、.NET側の問題ではなく、Oracle側の問題みたいですね。
かるあさんに教えていただいたページを参考に自分でもググってみましたが、欠番の問題は結構有名みたいですね(^_^;)
てっきり、セッションが影響しているのかな、と思っていたもので・・・

ブラウザを終了し、ブラウザを再起動して実行してもうまくいく場合もあるので、コネクション毎ではないのかもしれませんね。

引用:

飛び番が発生したり、必ずしも順番どおりにならないのがSEQUENCEの仕様です。もしそれでは困ると言うのであれば、別の方法を考えてください。

これはその通りですね


仕様ですか・・・
発番テーブルからの発番は工数がかかるので、お手軽に SEQUENCE を使おうと思ったのですが・・・
一応、SEQUENCE を NOCACHE で作成して様子を見てみます。それでもダメなら、発番の導入を検討します。

かるあさん、甕星さん、ありがとうございました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-17 09:37
引用:

ひろれいさんの書き込み (2006-05-17 09:20) より:

一応、SEQUENCE を NOCACHE で作成して様子を見てみます。それでもダメなら、発番の導入を検討します。


確かに NOCACHE でキャッシュ分飛んでしまうのは防げるかも知れませんが
ROLLBACK した場合は飛ぶので気をつけてください。

スキルアップ/キャリアアップ(JOB@IT)