Re: Consulta sobre Transacciones.

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: "Agustin(dot)PHP Casiva" <casivaagustin(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre Transacciones.
Date: 2006-03-07 23:05:28
Message-ID: 20060307230527.GE8897@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Agustin.PHP Casiva escribió:
> Buenas gente, quiero hacer una consulta sobre algo que no me queda muy claro
> hacerca del protocolo Wal.
>
> Quiero asegurarme de que esto es correcto.
>
> Cuando uno comienza una transaccion toda esta información se registra en el
> buffer de log.
> Al enviar el commit esto se guarda a los archivos de log en xlog.
> Por cuando sucede un checkpoint se guarda lo que esta en los logs en los
> archivos de datos.

Hmm ... Creo que podria ser correcto si es que la terminologia fuera
correcta, pero tu descripcion es algo caotica y no logro estar seguro si
estas entendiendo correctamente lo que dices.

De partida no existe ningun "buffer de log". Lo que existe es un area
de memoria compartida donde se guardan paginas del area de datos. Lo
llamaremos "buffers compartidos".

Otra cosa que existe es el registro transaccional (el WAL, el XLog, "los
archivos de log", como quieras llamarlo). No mezcles ambos conceptos
porque son totalmente diferentes y ortogonales.

WAL tiene dos reglas basicas:

1. cada vez que quieres hacer un cambio en el area de datos, antes de
escribir la pagina al disco es obligatorio escribir en el WAL cual es el
cambio que haras.

2. cada registro en el WAL lleva un numero de version, el cual se
escribe tambien en la pagina correspondiente. Se asume que el cambio de
un registro determinado ya fue aplicado si y solo si el numero de
version de la pagina es igual o mayor al numero de version del registro.

Cuando una transaccion empieza, no haces nada. Una transaccion que
empieza no toca el area de datos, por lo tanto las reglas de arriba no
son invocadas.

Cuando una transaccion que ya ha empezado hace un cambio (por ej.
ingresa un registro nuevo en una pagina de una tabla), se escribe en el
WAL "voy a escribir la tupla XYZ en la pagina WW de la tabla T".
Este registro en el WAL se marca con un "numero de version", que es un
numero monotonicamente creciente. Ademas, este cambio se puede marcar
con un identificador de transaccion (Xid). En el caso de una tupla
nueva, esta lleva el Xid dentro de si. Ahora que ya has registrado el
cambio en el WAL, puedes escribir en la pagina en el area de buffers
compartidos. A la pagina se le hacen dos cambios: primero se escribe la
tupla que acabas de insertar, y segundo se le pone como numero de
version el mismo numero con el que marcaste el registro en el WAL.

Cuando una transaccion termina exitosamente, se registra este Xid
diciendo "esta transaccion ha sido comprometida". Ademas, al WAL se le
hace un fsync(), de manera que si el sistema se cae en este momento, el
disco tiene la informacion del registro. Observa que al archivo de
datos no se le ha hecho fsync; no es necesario.

Durante un checkpoint, lo que se hace es tomar todas las paginas que
estan en el area de buffers compartidos, escribirlas a disco y hacer
fsync(). Ademas, se pone en el archivo de control la posicion del WAL
del registro de commit de la transaccion mas reciente que fue incluida
en este checkpoint.

Si el sistema se cae, se toma desde el archivo de control la posicion
del registro WAL. Se empieza leyendo WAL desde alli. Para cada
registro, se lee el numero de version tiene este registro. Luego se lee
la pagina desde disco a la que corresponde el registro. Si el numero de
version de la pagina es igual o mayor al del registro, se asume que el
cambio ya fue aplicado. De lo contrario se aplica el cambio.

Hay varios detalles menores adicionales. Por ejemplo el background
writer escribe paginas antes de checkpoint.

Se entiende? Deberia ser aproximadamente lo que tenias en mente.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Angel 2006-03-07 23:48:37 RE: Regresando tabla
Previous Message Miguel Angel 2006-03-07 22:31:07 Regresando una tabla