2010-08-09 5 views
4

des nombres entiers de 8 octets are now the default pour Postgres 8,4, de sorte qu'il autorise des valeurs de microsecondes à stocker. Je ne me soucie pas trop de la précision en microsecondes (dépend probablement des capacités du système d'exploitation?) - Mais est-ce que Postgres garantit que les valeurs d'horodatage (insérées par current_timestamp) sont toujours différentes entre deux transactions?Posgresql garantit-il des horodatages uniques?

Répondre

9

n °

J'ai fait un petit test, l'insertion current_timestamp de 5 clients parallell dans une table, 3 3463 enregistrements ont le même horodatage.

+0

Ok, c'est la réponse définitive - Je vais devoir chercher un autre solution alors. Merci! –

1

Même si c'est le cas, il semble dangereux de se fier aux valeurs uniques. Si vous avez besoin d'une clé unique, il vaut mieux utiliser une autre alternative, par exemple une colonne serial.

+0

J'aimerais faire - mais mon cas d'utilisation semble exiger que: je veux utiliser un champ de version dans JPA qui est globalement au moins la plupart du temps par ordre croissant, pour améliorer les performances (et pas seulement au sein d'une entité) . Mais JPA ne me permet malheureusement pas d'utiliser une colonne en série, une séquence ou une table de séquence pour un champ de version. Mais cela me permet d'utiliser un horodatage, et avec JPA, je peux supposer que le champ de version est ascendant (pour une entité), tant que la base de données garantit l'unicité. –

2

Oui, la précision dépend du système d'exploitation. Dans une transaction unique, les horodatages sont tous les mêmes lors de l'utilisation de CURRENT_TIMESTAMP, lors de l'utilisation de CLOCK_TIMESTAMP, ils peuvent être différents. Différentes transactions peuvent avoir différentes CURRENT_TIMESTAMPS, dépend de la vitesse à laquelle vous pouvez insérer/mettre à jour.

Si vous avez besoin d'unicité, ajoutez une contrainte unique.

+0

La contrainte unique est une bonne idée, mais une transaction peut insérer plusieurs instances dans une table, ce qui viole l'unicité. Il est normal que mon application ait le même horodatage, mais pas lorsqu'elle est insérée par différentes transactions. –

+0

Faites quelques tests pour voir si vous pouvez insérer/mettre à jour assez rapidement pour avoir des problèmes. –

+0

Ouais, c'est vraiment une situation où j'aurais une solution simple, ultra-rapide (pour la gestion de version dans mon application distribuée), mais au prix d'une petite chance d'erreurs. Ou d'autre part une solution, ce qui rendrait l'application beaucoup plus lent, et augmenter le trafic par un facteur important - mais il serait plus correct ... –

1

Heureusement non, car cela signifierait que l'option «veuillez faire en sorte que ce soit plus lent que cela doit être».

Si vous avez vraiment besoin de ce qui est vraiment une série, mais qui ressemble à un horodatage, ajoutez quelques microsecondes en fonction du résultat d'une série! Je suis d'accord avec la recommandation d'ajouter un numéro de série.

+0

Bon point, et une bonne idée. Je souhaite, JPA me permettrait de faire cela (il gère les horodatages pour les champs de version lui-même). –

+0

Pourquoi insiste-t-il sur le fait qu'une version est unique? Cela semble faire deux emplois de la même chose. Pourriez-vous ajouter vous-même vos propres colonnes de version et d'identité et ignorer cette fonctionnalité version + identité? –

+0

@ Jon: Je l'espère, je vais trouver un moyen d'étendre/remplacer le versioning de JPA avec mon propre versioning, mais je ne pense pas qu'il soit facile de le faire, car il fait partie intégrante de l'APP. –

1

Mais si ce que vous essayez de faire ne mérite pas un changement de schéma, vous pouvez utiliser la colonne système xmin pour séparer les lignes ayant le même horodatage mais provenant de transactions différentes.

SELECT ts, xmin, count(1) 
    FROM foo 
    GROUP BY ts, xmin 
Questions connexes