[pgsql-jp: 40260] Re: 複数DBのXID

Takahiro Itagaki itagaki.takahiro @ oss.ntt.co.jp
2010年 5月 7日 (金) 10:49:06 JST


sasaki <s.maoya @ gmail.com> wrote:

> お手数ですが、XIDについて教えて頂けたら助かります。
> トランザクションの度に数値が増えていくというのは分かる
> のですが、複数のDBが存在し、普段全く使用していない
> DBの数値も上がって行っているように思えます。
> 一つのDBにトランザクションが発生した場合、他のDBの
> XIDの値も影響するのでしょうか?

「DBのXID」は、一般的に良く知られた用語ではないと思われます。
たぶん age(pg_database.datfrozenxid) のつもりではないかと推測しますが、
明確に定義したほうが誤解が避けられます。

挙動については、以下の基本的な動作から推測は可能ですか?
- 次に払い出される XID は、データベースクラスタ単位で管理されています。
  複数のデータベース間で共有される値が使われることになります。
- pg_database.datfrozenxid は、そのデータベースで VACUUM が
  行われた際にのみ値が更新されます。
- age() は、与えた XID と、現在の XID の差を計算します。

ちなみに、PostgreSQL ではトランザクションは複数のデータベースを
跨ることはできないので、一見、各データベースごとに独立した XID を
払い出しても良さそうに見えるかもしれませんが、実際にはデータベース間で
共有されるシステムカタログ (pg_database, pg_authid, pg_tablespace 等) に
対しては、各データベースからの XID が「混じる」ことがあります。
そのため、クラスタ単位で一意のXIDを使う必要があるのです。

------------------------------------------------------------
NTT オープンソース ソフトウェア センタ
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>




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