Cuando ‘EXCLUSIVE’ no es tan exclusivo…

Cualquier DBA que se precie necesitó en algún momento crear un índice (antes del advenimiento del ‘online’) o cambiar una tabla en un sistema productivo.

Y en general, sistema productivo suele traducirse en NO HAY TIEMPO PARA DOWNTIME!

Una práctica poco conocida en informix es poner un lock exclusivo en la tabla a modificar, intentar el alter table y cruzar los dedos.

Pero hay alternativas en sistemas OLTP (donde las conexiones entran y salen todo el tiempo): decirle a informix que no acepte nuevas lecturas sobre esa tabla (dirty reads), hasta que pueda aplicar el cambio.

Rápidamente, se hace así:


IFX_DIRTY_WAIT=300
export IFX_DIRTY_WAIT
dbaccess blah <<
SET LOCK MODE TO WAIT;
BEGIN WORK;
LOCK TABLE IN EXCLUSIVE MODE;
ALTER TABLE ...;
COMMIT WORK;
EOF

O sea, le pido que durante 300 segundos mantenga (gracias al lock) afuera a los nuevos dirty readers (haciéndolos esperar hasta 300 segundos antes de dar error), esperando que las sesiones actuales finalicen (o dándome tiempo a matarlas!) para poder aplicar el cambio.

Si quieren una explicación profunda y detallada, lean esto:
http://informix-technology.blogspot.com.ar/2006/10/when-exclusive-is-not-really-exclusive.html de Fernando Nunes, que no solo lo cuenta mejor, sino con ejemplos y demases.

Leave a Reply