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.
