74.3. Subtransactions #

《機械翻訳》サブトランザクションはトランザクション内で開始されるため、大きなトランザクションを小さな単位に分割できます。 サブトランザクションは、親トランザクションに影響を与えることなくコミットまたは中断できるため、親トランザクションを継続できます。 これにより、エラーの処理が容易になります。 この用語は、よくsubxactと省略されます。

《機械翻訳》サブトランザクションはSAVEPOINTコマンドを使用して明示的に開始できますが、PL/pgSQLのEXCEPTION句などの他の方法でも開始できます。 PL/PythonとPL/TCLも明示的なサブトランザクションをサポートしています。 サブトランザクションは他のサブトランザクションから開始することもできます。 トップレベルのトランザクションとその子トランザクションは階層またはツリーを形成するため、トップレベルのトランザクションをトップレベルのトランザクションと呼びます。

《機械翻訳》サブトランザクションに仮想トランザクションID以外のIDが割り当てられた場合、そのトランザクションIDはsubxidと呼ばれます。 読取専用のサブトランザクションにはサブxidは割り当てられませんが、書込みを試みると割り当てられます。 これにより、トップレベルのトランザクションを含むすべての親サブトランザクションに、非仮想トランザクションIDが割り当てられます。 親xidは常に子xidのいずれかよりも小さいことを保証します。

《機械翻訳》各サブxidの直接の親xidはpg_subtransディレクトリに記録されます。 トップレベルのxidには親がないのでエントリは記録されません。 読み取り専用のサブトランザクションにもエントリは記録されません。

《機械翻訳》サブトランザクションがコミットされると、その子サブトランザクションのうち、すべての子サブトランザクションの xid がコミットされたものとみなされます。 サブトランザクションが中断された場合、その子サブトランザクションも中断されたものとみなされます。

《機械翻訳》xidを持つトップレベルトランザクションがコミットすると、そのサブトランザクションの子サブトランザクションもすべてpg_xactディレクトリに永続的にコミット済みとして記録されます。 トップレベルトランザクションが中断された場合、そのサブトランザクションは、たとえサブトランザクションがコミットされていたとしても中断されます。

《機械翻訳》トランザクションがオープンしたサブトランザクション数が多いほど(ロールバックや解放されない)、トランザクション管理のオーバーヘッドが大きくなります。 各バックエンドで最大64個のオープンしたサブトランザクションが共有メモリにキャッシュされます。 その後、pg_subtrans内のサブxidエントリの追加検索により、ストレージI/Oオーバーヘッドが大幅に増加します。