2010-01-19 8 views
18

J'ai une tableLes séquences ne sont pas affectées par les transactions?

create table testtable(
    testtable_rid serial not null, 
    data integer not null, 
    constraint pk_testtable primary key(testtable_rid) 
); 

permet donc dire que je fais ce code environ 20 fois:

begin; 
insert into testtable (data) values (0); 
rollback; 

puis-je faire

begin; 
insert into testtable (data) values (0); 
commit; 

Et enfin un

select * from testtable 
 
Result: 
row0: testtable_rid=21 | data=0 
Expected result: 
row0: testtable_rid=1 | data=0 

Comme vous pouvez le constater, les séquences ne semblent pas affectées par les annulations de transaction. Ils continuent d'augmenter comme si la transaction avait été validée, puis la ligne a été supprimée. Existe-t-il un moyen d'empêcher les séquences de se comporter de cette manière?

Répondre

26

Ce ne serait pas une bonne idée d'annuler des séquences. Imaginez deux transactions en même temps, chacune utilisant la séquence d'un identifiant unique. Si la deuxième transaction est validée et que la première est annulée, la seconde insère une ligne avec "2" tandis que la première ramène la séquence à "1".

Si cette séquence est ensuite utilisée à nouveau, la valeur de la séquence deviendra "2", ce qui pourrait entraîner un problème de contrainte unique.

+2

Si la deuxième transaction est validée, cette transaction doit obtenir le numéro de séquence 1. Comme la première transaction a été annulée, aucun numéro de séquence n'aurait été pris pour la première transaction. Bien sûr, PostgreSQL n'a pas implémenté cela, ni Oracle, mais à mon sens il n'y a pas de contraintes conceptuelles sur le séquençage transactionnel, seulement des contraintes dans l'implémentation. – Hartmut

5

Non, il n'y en a pas. Voir la note au bas de this page. C'est une mauvaise idée de faire quelque chose comme ça de toute façon. Si vous exécutez deux transactions en même temps, chacune insérant une ligne, vous voulez qu'elles insèrent des lignes avec des ID différents.

Questions connexes