[pgsql-jp: 30184] Re: Serial型の列とトランザクション

Jun Kitamura kitamura @ zoozee.jp
2003年 6月 17日 (火) 22:13:57 JST


北村です。


> 「連番」の作り方は、わかりました。ありがとうございます。
>    私にとっては、新知識です。
>    
> トランザクションに期待したのは ?
> 
> begin work;
> insert into tb (int,txt) values (9,'abc');
> insert into tb (int,txt) values (9,'abc');
> insert into tb (int,txt) values (9,'abc');
> insert into tb (int,txt) values (9,'abc');
> insert into tb (int,txt) values (9,'abc');
> insert into tb (int,txt) values (9,'abc');
> rollback work;
> 
> と複数の insert 文を実行した時に
> シーケンサーは、値を一つしか増やさなかったからです。
> 
> トランザクションを使わずに複数の挿入をするとその度に
> シーケンサーは、数を増やしてしまいます。
> 
> 従って、トランザクションは、 シーケンサーの働きを
> コントロールしているのではないか?
> と思えるからです。
> 
> この辺の仕掛けは解りませんか?

PostgreSQL のマニュアル、CREATE SEQUENCE を参照してください。
シーケンスは、最小値、最大値、開始番号、増加量、キャッシュ数
などを設定できます。先ほどのメールで説明が変だったので申し訳
ないのですが、増加量 1 でキャッシュ数 5 の場合、最初のトラン
ザクション(T1)は 1〜5 を確保(キャッシュ)します。このトランザ
クションがコミットまたはロールバックする前に別のトランザクショ
ン(T2)が実行されると、そのトランザクションは 6〜10 をキャッ
シュします。
ここは、記憶が曖昧で間違っているかもしれません。終了した「後」
でもキャッシュ分は破棄されていたかもしれません。つまり、T1 
が 1〜3を使って終了した後に T2 が開始されても、T1でキャッシュ
対象であった 4,5 は T1 によって破棄されているかもしれない、
という意味です。

この辺は、違うバージョンの PostgreSQL を用意するなどの面倒な
こと無しに、簡単に実験できるので実際に試してみることをお勧め
します。
例えば、伝票番号(番号は何でも良いが重ならない=シリアル値)を
シーケンスで実現する場合、1回の処理(トランザクション)で10枚
程度を生成(INSERT)する、と言った場合、キャッシュ数を10にして
おけば(例えば10ということです)、キャッシュ数1の時より高速に
処理されます(常に、というわけではありません)。

ご参考程度ですが。





pgsql-jp メーリングリストの案内