InnoDB
implementa un bloqueo a nivel de fila
estándar, donde hay dos tipos de bloqueos:
Compartido (Shared) (S
) le
permite a una transacción leer una fila.
Exclusivo (Exclusive) (X
) le
permite a una transacción actualizar o eliminar una fila.
Si una transacción A
sostiene un
bloqueo exclusivo (X
) sobre una tupla
t
, entonces una solicitud de otra
transacción B
para establecer un
bloqueo de cualquier tipo sobre t
no
puede ser atendida inmediatamente. En lugar de eso, la
transacción B
debe esperar a que la
transacción A
libere el bloqueo en
la tupla t
.
Si la transacción A
sostiene un
bloqueo compartido (S
) sobre una
tupla t
, entonces
Una solicitud de otra transacción
B
para un bloqueo
X
sobre
t
no puede ser atendido
inmediatamente.
Una solicitud de otra transacción
B
para un bloqueo
S
sobre
t
puede ser atendido
inmediatamente. En consecuencia, tanto
A
como
B
sostendrán un bloqueo
S
sobre
t
.
Adicionalmente, InnoDB
soporta
bloqueo de granularidad múltiple (multiple
granularity locking), el cual permite que existan
simultáneamente bloqueos en registros y bloqueos en tablas
enteras. Para hacer práctico el nivel de bloqueo de
granularidad múltiple, se emplean tipos adicionales de bloqueo,
llamados bloqueos de intención (intention
locks). Los bloqueos de intención son bloqueos de tabla en
InnoDB
. La idea detrás de los mismos es que
una transacción indique qué tipo de bloqueo (compartido o
exclusivo) requerirá más tarde sobre una fila de esa tabla. En
InnoDB
se utilizan dos tipos de bloqueos de
intención (asumiendo que la transacción
T
ha solicitado un bloqueo del tipo
indicado en la tabla R
):
Intención compartida (Intention shared)
(IS
): La transacción
T
trata de establecer bloqueos
S
en tuplas individuales de la
tabla T
.
Intención exclusiva (Intention exclusive)
(IX
): La transacción
T
trata de establecer bloqueos
X
en las tuplas.
Luego, el protocolo de bloqueo de intención es el siguiente:
Antes de que de una determinada transacción logre un
bloqueo S
en una determinada
fila, primero debe conseguir establecer un bloqueo
IS
o superior en la tabla que
contiene a la fila.
Antes de que de una determinada transacción logre un
bloqueo X
en una determinada
fila, primero debe conseguir establecer un bloqueo
IX
en la tabla que contiene a la
fila.
Estas reglas pueden resumirse convenientemente por medio de una matriz de compatibilidad entre tipos de bloqueo:
X | IX | S | IS | - | |
X | N | N | N | N | S |
IX | N | S | N | S | S |
S | N | S | S | S | S |
IS | N | S | S | S | S |
- | S | S | S | S | S |
Por lo tanto, los bloqueos de intención solamente bloquean
solicitudes sobre tablas completas (Ej: LOCK TABLES ...
WRITE
). El propósito principal de
IX
y IS
es
mostrar que alguien está bloqueando una fila, o va a bloquear
una fila en la tabla.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.