No es un bug, es una característica no documentada

lunes, 27 de abril de 2015

Bases de datos. SQL programado (XIV). Abrazo mortal

9:27 Posted by Inazio , No comments
Lo primero de todo, dejar claro que con DeadLock no me refiero a ellos:


Así que si entraste buscando Death Metal... bueno, supongo que serás un poco especial, que el titulo del blog ya da alguna pista del temario a tratar.

Bien, aclarado esto, vayamos al ajo.

Un abrazo mortal (o DeadLock) se produce cuando una transacción A intenta modificar los datos que están siendo modificados por una transacción B y a su vez ésta última intenta modificar los datos que están siendo modificados por la primera transacción A. Tal que así:


Al producirse el DeadLock una de las dos transacciones hará un ROLLBACK lo que llevará a provocar una situación de error. Normalmente la información actualizada se guardará para que la visualice el usuario que pidió los datos primeros.

Una de las soluciones para evitar los abrazos mortales son los cursores de actualización (CURSOR FOR UPDATE).

Imagina un ejemplo que se quiere modificar los datos de una tabla de alumnos. Podría darse el caso que se quiera modificar dos alumnos a la vez. Lo evitamos de la siguiente manera.


Eso sí, hay que tener en cuenta que si bloqueas más de una fila, el comportamiento de MySQL es de bloquear todo el bloque físico al que pertenecen esas dos (o más) que quieres bloquear.
Pero a efectos prácticos, la idea que debemos asimilar es que se bloquean las filas que necesitamos. El bloque... bueno, es una consecuencia de ir buscando vueltas de rosca.

0 comentarios:

Publicar un comentario