O thread 2 mantém um bloqueio compartilhado na linha da tabela de usuários.
Em seguida, o thread 1 tenta obter um bloqueio exclusivo na mesma linha e entra em espera de bloqueio.
Mas a thread 1 não terá a oportunidade de expirar, pois a thread 2 tenta escalar seu bloqueio para exclusivo... fio 2.
Um está bloqueando o outro.
Isso é um impasse.
O servidor seleciona uma transação para matar, para que elas não se bloqueiem desnecessariamente.
A detecção de deadlock permite que um thread tenha sucesso imediato às custas do outro. Caso contrário, ambos ficariam presos na fechadura, espere até que um deles morresse por esperar demais.
Você está no modo de confirmação automática, mas é claro que isso não significa que você não esteja em uma transação. Cada consulta com o InnoDB ainda é tratada em uma transação, mas com o autocommit, a transação é iniciada implicitamente quando a consulta começa a ser executada e confirmada implicitamente quando ela é bem-sucedida.