[Pgsql-ayuda] De campos seriales, commits y roll-backs

Gunnar Wolf gwolf@campus.iztacala.unam.mx
Tue, 23 Jul 2002 16:22:43 -0500 (CDT)


Hola,

Observ=E9 hoy algo bastante curioso: Estoy haciendo una aplicacioncita en
Perl, usando PostgreSQL 7.2.1. Tengo una tabla que tiene un campo serial.
Ahora, para hacer unas pruebas, hice lo siguiente: (simplificado)

1  $dbh->{'AutoCommit'} =3D 0;
2  $sth =3D $dbh->prepare('INSERT INTO tabla (campo1, campo2, campo3) VALUE=
S (?,?,?)');
3  $sth->execute(1,2,3);
4  $sth->execute(4,5,6);
5  $sth->finish;
6
7  $sth =3D $dbh->prepare('SELECT id,campo1,campo2,campo3 FROM tabla');
8  $sth->execute;
9  while (my @row =3D $sth->fetchrow_array) {
10     print join(', ', @row);
11 }
12 $sth->finish;
13 $dbh->rollback;

O, traduci=E9ndolo al espa=F1ol:
1: Deshabilita AutoCommit, haciendo necesario un commit para efectuar los
   cambios, o un rollback para revertirlos.
2-5: Inserta los renglones (1,2,3) y (4,5,6) en la tabla.
7-12: Muestra toda la informaci=F3n contenida en la tabla.
13: Revierte los cambios efectuados.

Entiendo que este programita deber=EDa tener un impacto nulo en la BD, por
el rollback que estoy usando al final. Sin embargo, si lo corro una vez,
me da:

1, 1, 2, 3
2, 4, 5, 6

y si lo corro una segunda vez:

3, 1, 2, 3
4, 4, 5, 6

Lo que me indica que si bien est=E1 revirtiendo los cambios en la tabla,
est=E1 efectuando los cambios en la secuencia a la que est=E1 asociado id.

Buscando la l=F3gica de esto, se me hace correcto, pues evita que si dos
solicitudes se efect=FAan m=E1s o menos a la vez, y una de ellas es reverti=
da,
cambie la secuencia en la que aparecen ingresadas... Sin embargo, es una
preocupaci=F3n te=F3rica: =BFQu=E9 no un rollback debe dejar la BD *tal cua=
l
estaba* antes de la transacci=F3n?

Saludos,

--=20
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF