primary not incremento create campos automatico autoincrementales autoincrement auto_increment mysql locking innodb rowlocking

not - mysql create table identity



¿Cuándo exactamente MySQL bloquea una fila al actualizar la tabla InnoDB? (2)

Si tengo esta consulta multi actualización

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 usuarios ya tiene el nombre ''same_name_i_already_had'', por lo que no debería actualizarse.

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

Asumiendo MySQL como RDBMS e InnoDB con su sistema de bloqueo de filas como el motor de ambas tablas,

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


Casi seguro que bloquea la fila independientemente. No conozco ningún campo simple que se verifique primero para un cambio. Es más fácil y rápido bloquear, escribir y desbloquear. Si hubo un control antes del bloqueo, entonces hay una condición de carrera: algo que un bloqueo evita completamente.


Se bloquea la fila en el user . Puedes verificar esto usando la excelente herramienta innotop .

  • Ejecute innotop y presione la tecla ''L'' para mostrar una pantalla de bloqueos InnoDB.
  • Abra otra sesión, inicie sesión en MySQL y comience la transacción.
  • Ejecute la ACTUALIZACIÓN que mostró, pero no COMPRUEBE todavía.
  • Ver los bloqueos en la pantalla innotop.

Por ejemplo, creé las tablas user y user_profile en mi VM de prueba ejecutando MySQL 5.5, y realicé los pasos que enumeré anteriormente. 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