Pregunta

Estoy leyendo un manual sobre las transacciones innodb, pero aún así, hay muchas cosas poco claras para mí. Por ejemplo, no entiendo el siguiente comportamiento:

-- client 1                             -- client 2
mysql> create table simple (col int) 
       engine=innodb; 

mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select @@tx_isolation;                                                              
+-----------------+                                                                         
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |                                                                         
+-----------------+

mysql> begin;                                    
Query OK, 0 rows affected (0.01 sec)            
                                        mysql> begin;
                                        Query OK, 0 rows affected (0.00 sec)

mysql> update simple set col=10 where col=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

                                         mysql> update simple set col=42 where col=2;
                                         -- blocks

Ahora, el último comando de actualización (en el cliente 2) espera. Esperaría que el comando ejecute porque supongo que solo la fila 1 está bloqueada. El comportamiento es el mismo incluso si el segundo comando en el cliente 2 es insert. ¿Alguien podría describir el fondo de bloqueo detrás de este ejemplo (dónde y por qué las cerraduras)?

¿Fue útil?

Solución

InnoDB establece tipos específicos de cerraduras de la siguiente manera.

  • Seleccione ... desde es una lectura consistente, leyendo una instantánea de la base de datos y configurar no bloqueos a menos que el nivel de aislamiento de transacciones esté configurado en Serializable. Para un nivel serializable, los conjuntos de búsqueda comparten bloqueos de próxima clave en los registros de índice que encuentra.

  • Seleccione ... de ... Bloquear en el modo compartido Conjuntos compartidos BLOQUETES DE CLAY COMPAÑÍA EN TODOS LOS REGISTROS DE INDEX los encuentros de búsqueda.

  • Para los registros de índice los encuentros de búsqueda, seleccione ... Desde ... para Bloqueos de actualización que otras sesiones hacen SELECT ... Desde ... Bloquear en modo compartido o leer en ciertos niveles de aislamiento de transacciones. Las lecturas consistentes ignorarán cualquier bloqueo establecido en los registros que existen en la vista de lectura.

  • Actualización ... dónde ... establece un bloqueo exclusivo de próxima clave en cada registro de los encuentros de búsqueda.

  • Eliminar de ... donde ... establece un bloqueo exclusivo de próxima clave en cada registro de los encuentros de búsqueda.

  • Insertar establece un bloqueo exclusivo en la fila insertada. Este bloqueo es un bloqueo de registro de índice, no un bloqueo de próxima tecla (es decir, no hay bloqueo de brecha) y no evita que otras sesiones se inserten en el espacio antes de la fila insertada.

InnoDB tiene varios tipos de cerraduras de nivel de registro:

  • Bloqueo de registro: este es un bloqueo en un registro de índice.

  • Bloqueo de brecha: este es un bloqueo en una brecha entre los registros de índice, o un bloqueo en la brecha antes del primero o después del último registro de índice.

  • Bloqueo de la siguiente tecla: esta es una combinación de un bloqueo de registro en el registro de índice y un bloqueo de brecha en la brecha antes del registro de índice.

Ver más :

Evitar el problema fantasma usando el bloqueo de próxima tecla

Evitar el punto muerto

Otros consejos

Ypercube lo tiene bien. Específicamente, sin un índice único que se usa en la condición, bloqueará más que la fila única afectada.

Para ver el comportamiento que espera, cambie la creación de su tabla a esto:

create table simple (col int unique) ENGINE=InnoDB;

El índice único en el col El campo permitirá que bloquee solo la fila afectada.

"Para los registros de índice los encuentros de búsqueda, seleccione ... Desde ... para Bloqueos de actualización Otras sesiones de hacer Select ... Desde ... Bloquear el modo compartido o leer en ciertos niveles de aislamiento de transacciones. Las lecturas consistentes ignorarán cualquier bloqueo Establezca en los registros que existen en la vista de lectura "

¿Cuáles son ciertas cerraduras que se pueden aplicar con selección de actualización para que otras sesiones no puedan leer el registro bloqueado?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top