[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 メーリングリストの案内