Eu sei que esse problema pode ser resolvido usando restrição de chave exclusiva na coluna e alguma variação do comando de inserção.
Mas eu quero saber exatamente por que a seguinte abordagem às vezes dá errado e uma entrada duplicada é adicionada:
- um valor é verificado na coluna
- se o registro retorna for > 0, então a atualização é emitida, caso contrário, comando de inserção simples
Na maioria das vezes funciona. Você pode dizer mais de 98%, mas por que às vezes falha?
Eu só quero entender onde está a falha nessa abordagem porque a existência do registro é verificada primeiro.
Um cenário em que isso falharia depende de quão ocupado (ou azar) você está no tempo.
É tudo uma questão de timing (conforme sugerido pelos seus 98% de trabalhos). Você pode adquirir um
WRITE LOCK
para a Sessão A na tabela que está inserindo E na tabela que está atualizando o valor, que bloqueará a Sessão B até que a Sessão A libere o bloqueio.Como alternativa, você pode seguir em frente e deixar o banco de dados lidar com o bloqueio automaticamente criando um UNIQUE INDEX e emitindo um INSERT .. ON DUPLICATE UPDATE (recomendado)