Maison >base de données >tutoriel mysql >Comment générer des séquences d'identification sans écart dans PostgreSQL sans tentatives ?

Comment générer des séquences d'identification sans écart dans PostgreSQL sans tentatives ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-25 14:17:10206parcourir

How to Generate Gap-Free ID Sequences in PostgreSQL Without Retries?

Génération de séquences d'identification sans lacunes dans PostgreSQL sans logique de nouvelle tentative

Dans les scénarios où des identifiants uniques sans lacunes sont essentiels, comme la numérotation des factures , générer de telles séquences sans interruption est un défi courant. L'approche traditionnelle consistant à interroger le dernier numéro utilisé et à l'incrémenter peut rencontrer des problèmes sous les niveaux d'isolement de sérialisation, ce qui complique la tâche.

Comprendre le problème de génération d'espace

Les lacunes dans les séquences de numéros surviennent en raison des mécanismes de base de données. Lorsqu'une transaction qui a généré un numéro est annulée ou rencontre une erreur, la base de données marque le numéro utilisé comme « utilisé » sans l'attribuer. Cela entraîne des lacunes potentielles dans les séquences générées futures.

Techniques alternatives d'élimination des lacunes

Tableau générateur de nombres dédié :

Au lieu d'utiliser des séquences, conservez une table dédiée pour stocker et gérer les nombres générés. Cette table peut être conçue pour gérer les accès simultanés à l'aide de mécanismes de verrouillage appropriés.

Encapsuler la logique de génération de numéros :

Créer une fonction ou une procédure qui encapsule la logique de génération de numéros et sérialise accès à l'aide de mécanismes de verrouillage. Cette approche garantit que tous les processus utilisent la même méthode et évite les conflits.

Génération de numéros retardée :

Reportez la génération des numéros jusqu'au dernier moment possible de la transaction. Cela minimise la fenêtre d'opportunité pour les écarts potentiels dus à des restaurations ou à des erreurs.

Gestion des erreurs :

Implémentez un mécanisme pour « renvoyer » les nombres générés au pool si le la transaction échoue. Cela garantit que les numéros ne sont pas perdus et peuvent être utilisés lors de tentatives futures.

Référence originale de l'article :

Pour plus d'informations, reportez-vous à l'article complet intitulé "Le Difficulté de conserver les numéros de facture en continu à l'aide de bases de données" par Simon Fell : https://blog.codinghorror.com/the-difficulty-of-keeping-invoice-numbers-continuous-using-databases/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn