2010-01-19 12 views
18

Mam tabeliSekwencje, na które transakcje nie mają wpływu?

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

Więc powiedzmy, że mam ten kod około 20 razy:

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

a następnie zrobić

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

I wreszcie

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

Jak widać, sekwencje nie mają wpływu na wycofywanie transakcji. Nadal zwiększają się, tak jakby transakcja została zatwierdzona, a następnie wiersz został usunięty. Czy istnieje sposób, aby zapobiec zachowaniu się sekwencji w ten sposób?

Odpowiedz

26

Nie byłoby dobrym pomysłem wycofywanie sekwencji. Wyobraź sobie dwie transakcje odbywające się w tym samym czasie, z których każda używa sekwencji dla unikalnego identyfikatora. Jeśli druga transakcja zostanie zatwierdzona, a pierwsza transakcja wycofa się, druga wstawi wiersz z "2", a pierwszy przetasuje sekwencję z powrotem na "1".

Jeśli ta sekwencja zostanie ponownie użyta, wartość sekwencji zmieni się na "2", co może prowadzić do unikalnego problemu z więzami.

+2

Jeśli druga transakcja zostanie zatwierdzona, transakcja ta powinna otrzymać numer porządkowy 1. Ponieważ pierwsza transakcja została wycofana, numer pierwszej sekwencji nie zostałby podjęty dla pierwszej transakcji. Pewnie, PostgreSQL tego nie zaimplementował, ani Oracle, ale imho nie ma żadnych ograniczeń koncepcyjnych dotyczących sekwencjonowania transakcyjnego, tylko ograniczenia w implementacji. – Hartmut

5

Nie, nie ma. Zobacz notatkę na dole: this page. W każdym razie to zły pomysł, aby zrobić coś takiego. Jeśli masz dwie transakcje działające w tym samym czasie, każde wstawienie jednego wiersza powoduje wstawianie wierszy o różnych identyfikatorach.

Powiązane problemy