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?
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