理解すべき重要なポイント:
-
すべて トランザクション中です。
BEGINで明示的に作成しない場合 およびCOMMIT(またはROLLBACK)そのステートメントのためだけに作成されます。 -
読み取り専用の
SELECT■完全なトランザクションIDを取得するのではなく、仮想トランザクションIDのみを取得します。したがって、トランザクションであっても、SELECT 1;または、トランザクションIDカウンターをインクリメントしないもの。 -
txid_current()を呼び出す 力 トランザクションIDがまだ割り当てられていない場合は、その割り当て。そのため、読み取り専用トランザクションには、以前はなかったトランザクションIDが含まれるようになります。
もちろん、txidもセッション間で割り当てられます。実際には、データベースがビジーの場合、上記の例ではa+1とa+429のtxidが取得される可能性があります。
一般に、アプリケーションレベルでトランザクションIDを使用することは賢明ではありません。特に:
xminを処理する およびxmax 内部システムレベルのフィールドとして、txid_current()の結果を扱います 意味のない数値として。
xidsの正しい使用法と誤った使用法の詳細
特に、絶対にすべきではありません:
- xidを数値で比較して、順序について何らかの結論を導き出します。
- トランザクションIDを追加または削除します;
- トランザクションIDを並べ替えます;
- トランザクションIDをインクリメントまたはデクリメントします
- 32ビットの
xidを比較します 64ビットのbigintで入力されたフィールド 平等であっても、エポック拡張xid。
したがって、アプリケーションの観点からは、xidsは単調でも序数でもありません。
できます 安全に:
- 2つの64ビットエポック拡張xidを比較して等式または不等式にします。および
- xidsを
txid_status(...)に渡します およびxidを取得するものとして文書化されているその他の機能
注意:PostgreSQLはxidのような32ビットのナローxidを使用します タイプ、および64ビットのエポック拡張xidは、通常bigintとして表されます txid_current()によって返されるもののように 。これらを同等と比較することは、通常、新しいデータベースのインストールで機能するように見えますが、最初のエポックラップアラウンドが発生すると、同等ではなくなります。 Pgは、SQLレベルでxidエポックを確認する簡単な方法さえ提供しません。あなたがしなければならないこと:
select (txid_current() >> 32) AS xid_epoch;
txid_current()によって報告されたエポック拡張xidの上位32ビットを取得する 。
つまり...何をしようとしても、トランザクションIDが正しい方法ではない可能性があります。