2011-06-29 10 views
15

Si tengo esta consulta MultiUpdate¿Cuándo exactamente MySQL bloquea una fila al actualizar la tabla InnoDB?

UPDATE user u 
INNER JOIN user_profile up ON up.user_id = u.id 
SET u.name = 'same_name_i_already_had', up.profile.age = 25 
WHERE u.id = 10 

Supongamos que la fila 10 en la tabla de usuario ya tiene el nombre 'same_name_i_already_had', por lo que no debería ser actualizado.

Por otro lado, la fila en la tabla user_profile tiene una antigüedad diferente, por lo que MySQL debería actualizarla.

Suponiendo MySQL como RDBMS y InnoDB con su sistema de bloqueo a nivel de fila como el motor de ambas tablas,

¿Bloquea MySQL la fila en la tabla de usuario a pesar de no tener que actualizar el campo de nombre de esa fila ?

Gracias !!

Respuesta

12

Bloquea la fila en user. Puede verificar esto usando la excelente herramienta innotop.

  • Ejecute innotop y presione la tecla 'L' para visualizar una pantalla de bloqueos InnoDB.
  • Abre otra sesión, inicia sesión en MySQL y START TRANSACTION.
  • Ejecute la ACTUALIZACIÓN que mostró, pero aún NO COMIENCE.
  • Ver los bloqueos en la pantalla innotop.

Por ejemplo, creé tablas user y user_profile en mi VM de prueba con MySQL 5.5, y realicé los pasos que enumero más arriba. Aquí está la salida:

[RO] Locks (? for help) localhost, 08:34.568, InnoDB 10s :-), 0.10 QPS, 2/0/0 con/run/cac thds, 5.5. 

__________________________________________ InnoDB Locks __________________________________________ 
ID Type Waiting Wait Active Mode DB Table   Index Ins Intent Special   
2 TABLE   0 00:00 02:35 IX test user       0     
2 RECORD  0 00:00 02:35 X  test user   PRIMARY   0 rec but not gap 
2 TABLE   0 00:00 02:35 IX test user_profile     0     
2 RECORD  0 00:00 02:35 X  test user_profile PRIMARY   0 rec but not gap 
+0

Excelente respuesta, sin embargo, no entiendo los bloqueos de MESA que se muestran. ¿Podrías explicar lo que significa innotop? –

+2

El modo "IX" es un bloqueo de nivel de tabla que significa "I * intención * de bloquear algunas filas en esta tabla". No bloqueará bloqueos a nivel de fila en la misma tabla, pero bloqueará bloqueos a nivel de tabla. Consulte http://dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html para obtener una explicación completa del bloqueo de InnoDB y http://innotop.googlecode.com/svn/html/manual. .html para una explicación completa del uso de innotop. –

+0

La mejor respuesta que he tenido. ¡Muchas gracias! –

4

Casi seguramente bloquea la fila independientemente. No sé de ningún campo simple que se revise primero. Es más fácil y rápido simplemente bloquear, escribir y desbloquear. Si hubo un control antes de bloquear, entonces hay una condición de carrera: algo que un bloqueo evita por completo.

Cuestiones relacionadas