再試行ロジックを使用しない PostgreSQL でのギャップフリー ID シーケンスの生成
請求書の番号付けなど、ギャップフリーの一意の識別子が不可欠なシナリオ、ギャップのないこのようなシーケンスを生成することは一般的な課題です。最後に使用された数値をクエリしてそれをインクリメントする従来のアプローチでは、シリアル化分離レベルで問題が発生し、タスクが複雑になる可能性があります。
ギャップ生成問題を理解する
ギャップ数値シーケンスはデータベースのメカニズムによって発生します。番号を生成したトランザクションがロールバックするかエラーが発生すると、データベースは実際に番号を割り当てるわけではなく、使用済みの番号を「使用済み」としてマークします。これにより、今後生成されるシーケンスにギャップが生じる可能性があります。
代替ギャップ除去手法
専用の番号生成テーブル:
シーケンスを使用する代わりに、生成された数値を保存および管理するための専用のテーブルを維持します。このテーブルは、適切なロック メカニズムを使用して同時アクセスを処理するように設計できます。
番号生成ロジックのカプセル化:
番号生成ロジックをカプセル化してシリアル化する関数またはプロシージャを作成します。ロック機構を使用してアクセスします。このアプローチにより、すべてのプロセスが同じメソッドを使用し、競合が防止されます。
遅延番号生成:
トランザクションの可能な最後の瞬間まで番号の生成を延期します。これにより、ロールバックやエラーによる潜在的なギャップが発生する機会が最小限に抑えられます。
エラーの処理:
次の場合に、生成された数値をプールに「返す」メカニズムを実装します。トランザクションが失敗します。これにより、番号が失われることがなくなり、今後の試行で使用できるようになります。
元の記事参照:
さらに詳しい情報については、「The」というタイトルの包括的な記事を参照してください。データベースを使用して請求書番号を継続的に維持することの難しさ」(Simon Fell著): https://blog.codinghorror.com/the-difficulty-of-keeper-invoice-numbers-continuous-using-databases/
以上がPostgreSQL で再試行せずにギャップのない ID シーケンスを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。