Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL travando em erro de chave duplicada


Acho que você está simplificando a terminologia/processo. Depois que a consulta é analisada e antes de ser executada, ela precisa adquirir os bloqueios necessários. É neste momento que se determina que:
  • a sessão 1 obtém o bloqueio exclusivo, pois está inserindo e não há outros bloqueios
  • as sessões 2 e 3 são enfileiradas para o bloqueio compartilhado porque o bloqueio exclusivo já está retido pela sessão 1, e as sessões 2 e 3 estão com um erro de chave duplicada

Conforme acima, as sessões 2 e 3 são enfileiradas para bloqueios compartilhados porque estão em erro de chave duplicada. No entanto, quando a sessão 1 exclui a chave e libera o bloqueio exclusivo, agora as sessões 2 e 3 recebem bloqueios compartilhados. Neste ponto ambos tentam adquirir um cadeado exclusivo para completar a inserção. Nenhum deles pode, porém, porque o outro já está segurando o bloqueio compartilhado. Portanto, o bloqueio exclusivo não é concedido a nenhum deles e eles travam.