2010-01-19 6 views
18

Tengo una tablaSecuencias no afectadas por las transacciones?

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

lo que permite decir que hago este código alrededor de 20 veces:

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

y luego hacer

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

Y por último, una

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 comprometido y luego se borró la fila. ¿Hay alguna manera de evitar que las secuencias se comporten de esta manera?

Respuesta

26

No sería una buena idea deshacer las secuencias. Imagina dos transacciones al mismo tiempo, cada una de las cuales usa la secuencia para una identificación única. Si la segunda transacción se compromete y la primera transacción se revierte, la segunda inserta una fila con "2" mientras que la primera devuelve la secuencia a "1".

Si esa secuencia se vuelve a utilizar, el valor de la secuencia se convertirá en "2", lo que podría ocasionar un problema de restricción único.

+2

Si la segunda transacción se compromete, esta transacción debe obtener la secuencia número 1. Dado que la primera transacción se retrotrajo, no se habría tomado un número de secuencia para la primera transacción. Claro, PostgreSQL no implementó eso, ni Oracle, pero no hay restricciones conceptuales contra la secuenciación transaccional, solo restricciones en la implementación. – Hartmut

5

No, no lo hay. Vea la nota en la parte inferior de this page. De todos modos, es una mala idea hacer algo así. Si tiene dos transacciones ejecutándose al mismo tiempo, cada una insertando una fila, quiere que inserten filas con diferentes ID.

Cuestiones relacionadas