sql >> データベース >  >> RDS >> PostgreSQL

PosgreSQL txid_current()値を解釈する方法

    理解すべき重要なポイント:

    • すべて トランザクション中です。 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が正しい方法ではない可能性があります。




    1. InnoDBテーブルを修復するにはどうすればよいですか?

    2. 挿入中にC#でSQLの一意の制約違反をキャッチするための最良の方法

    3. Oracleで非ヌル制約を作成する方法

    4. PostgreSQL SHOW TABLES Equivalent(psql)