es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo toma y mantiene InnoDB bloqueos de registro en el nivel READ COMMITTED?

mysql-refman-5.7, 14.7.2.1 Niveles de Aislamiento de Transacción, dice:

Bajo READ COMMITTED,
1. “Para las sentencias UPDATE o DELETE, InnoDB mantiene bloqueos solo para las filas que actualiza o elimina. Los bloqueos de registros para filas que no coinciden se liberan después de que MySQL evalúa la condición WHERE.”
2. “Sin embargo, si la condición WHERE incluye una columna indexada, y InnoDB utiliza el índice, solo se considera la columna indexada al tomar y retener bloqueos de registros.”

Entonces, ¿la primera descripción está en conflicto con la segunda?

Aquí tienes el ejemplo:
sql
mysql> show create table t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE t (
a int(11) NOT NULL,
b int(11) DEFAULT NULL,
c int(11) DEFAULT NULL,
KEY b (b)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

sql
mysql> select * from t order by b,c;
+---+------+------+
| a | b | c |
+---+------+------+
| 2 | 2 | 4 |
| 1 | 3 | 3 |
| 3 | 3 | 4 |
| 4 | 5 | 6 |
+---+------+------+

“`sql

<h1>Sesión A:</h1>

mysql> set TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update t set c = 5 where b=3 and c =3;
Query OK, 1 row affected (0.00 sec)
“`

sql
Sesión B:
mysql> set TRANSACTION ISOLATION LEVEL READ COMMITTED;
mysql> update t set c = 2 where b=3 and c =4; # esperando por bloqueo

Entonces, la Sesión A bloquea todos los registros con b=3, ¿por qué no solo bloquea el registro con b=3 y c=3?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No, la primera descripción no entra en conflicto con la segunda. En el ejemplo dado, la Sesión A actualiza el registro con b=3 y c=3, por lo que adquiere un bloqueo en ese registro. Sin embargo, también adquiere bloqueos compartidos en todas las demás filas con b=3. Esto se debe a que la cláusula WHERE en la instrucción UPDATE de la Sesión A coincide con ambas filas con b=3, pero dado que hay un índice en la columna b, InnoDB toma un bloqueo compartido en todas las filas con b=3 antes de evaluar la cláusula WHERE. Esto se conoce como bloqueo de registros de índice y es consistente con la segunda descripción. Una vez que se evalúa la cláusula WHERE, InnoDB libera los bloqueos compartidos en las filas que no coinciden con la cláusula WHERE, lo cual es consistente con la primera descripción. Por lo tanto, no hay conflicto entre las dos descripciones.

Comments are closed.