Sí, está bloqueando todas las filas de la tabla cuando tiene una condición en una columna no indexada como user_id
.
Los bloqueos se aplican a todas las filas "examinadas". Su condición WHERE user_id = <user_id>
debe examinar todos las filas de la tabla y pruébelas una por una para ver si coinciden con el valor de <user_id>
.
Ambas consultas examinan todo el conjunto de filas, aunque buscan diferentes valores específicos de <user_id>
, por lo que entran en conflicto.
Si tuviera un índice en el user_id
entonces MySQL usaría ese índice para encontrar las filas coincidentes primero, luego solo las filas coincidentes se convertirían en filas examinadas y, por lo tanto, estarían bloqueadas.
Esto no tiene nada que ver con el nivel de aislamiento de transacciones. Estos tipos de bloqueos ocurren en todos los niveles de aislamiento de transacciones.