■2-06■ トランザクションID(XID)の管理トランザクションIDトランザクションID(XID)はトランザクション管理の根幹を担う重要な値です。ここでは、その管理方法について解説します。XIDはデータ操作を行うたびに増加します。XIDが小さいほど古いバージョンです。ですから、あるXID以下のデータのみを取り出すことで、データベースの過去のスナップショットを得ることができます。 XIDは32[bit]の符号無し整数で、0から232-1(約42億)までの範囲の値を取ります。ただし、単純にXIDの大小関係で過去と未来を識別しようとすると、XIDが2サイクル目に入って(再度)小さな値を使いはじめた瞬間にトランザクション管理が破綻します。これを避けるため、PostgreSQLは2つの工夫がなされています(バージョン7.2から)。 (1)無限の過去を意味するXID=2を導入 XIDの値が、かなり大きい時点でVACUUM 文を実行すると、現在のXIDより10 億以前の(トランザクション処理が終了した過去の)XID をすべて2 につけ換え、“無限の過去のデータ”として保存しなおします。 例えば、現在のXIDが15億とします。VACUUM文を実行すると(トランザクション処理の終了した)5億以下のXIDを2に変更して、以降はそれらのデータを“無限の過去のデータ”とみなします。この操作を、“データを凍結(Freeze)する”といいます(【図.2-8】参照)。 図.2-8 データの凍結 最大値(232-1)の次のXID値は3、次は4、という具合にXID を循環させて、32bitの整数空間を繰り返し利用するようにします。そして、あるXID にとって過去のXID とは、そのXIDよりも21億(正確には231-1)以前の値と解釈することにします(未来のXIDとは21億先までの値)。 よって、定期的にVACUUM文でトランザクション処理の終了したデータを“凍結”していれば、XIDが3から232-1の範囲を循環しながら、トランザクション管理を破綻なく続けることができます。 [PREVIOUS][UP][NEXT] |