理解すべき重要なポイント:
-
すべて トランザクション中です。
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が正しい方法ではない可能性があります。