Sim, você está bloqueando todas as linhas da tabela quando tem uma condição em uma coluna não indexada como
user_id
. Os bloqueios se aplicam a todas as linhas "examinadas". Sua condição
WHERE user_id = <user_id>
deve examinar todos as linhas na tabela e teste-as uma a uma para ver se elas correspondem ao valor de <user_id>
. Ambas as consultas estão examinando todo o conjunto de linhas, embora estejam procurando valores específicos diferentes de
<user_id>
, então eles entram em conflito. Se você tivesse um índice no
user_id
coluna, então o MySQL usaria esse índice para encontrar as linhas correspondentes primeiro, então apenas as linhas correspondentes se tornariam linhas examinadas e, portanto, seriam bloqueadas. Isso não tem nada a ver com o nível de isolamento da transação. Esses tipos de bloqueios ocorrem em todos os níveis de isolamento de transações.