postgresql - postgres - ¿Secuencias no afectadas por las transacciones?
subquery postgresql examples (2)
Tengo una mesa
create table testtable(
testtable_rid serial not null,
data integer not null,
constraint pk_testtable primary key(testtable_rid)
);
Así que digamos que hago este código unas 20 veces:
begin;
insert into testtable (data) values (0);
rollback;
y luego hago
begin;
insert into testtable (data) values (0);
commit;
Y finalmente un
select * from testtable
Result: row0: testtable_rid=21 | data=0 Expected result: row0: testtable_rid=1 | data=0
Como puede ver, las secuencias no parecen verse afectadas por las reversiones de transacciones. Continúan incrementándose como si la transacción se hubiera confirmado y luego se eliminó la fila. ¿Hay alguna manera de evitar que las secuencias se comporten de esta manera?
No sería una buena idea deshacer las secuencias. Imagine dos transacciones que ocurren al mismo tiempo, cada una de las cuales usa la secuencia para una identificación única. Si la segunda transacción se confirma y la primera se revierte, la segunda inserta una fila con "2", mientras que la primera devuelve la secuencia a "1".
Si esa secuencia se usa nuevamente, el valor de la secuencia se convertirá en "2", lo que podría llevar a un problema de restricción único.
No, no hay. Vea la nota al final de esta página . Es una mala idea hacer algo así de todos modos. Si tiene dos transacciones ejecutándose al mismo tiempo, cada una insertando una fila, desea que inserten filas con diferentes ID.