Pergunta

Eu tenho um aplicativo Django relativamente simples, com uso bastante pesado responsável por alguma simultaneidade nas operações do banco de dados.

Eu tenho uma postagem modelo com um M2M em um modelo de tag.

Uma única linha no meu código, p.add(t) está causando repetidamente exceções MySQL (onde p é uma instância post e t é uma instância de tag.)

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")

Quando isso for criado, posso executar manualmente isso p.add(t) Com sucesso, deve ter a ver com algum estado peculiar que o banco de dados/aplicativo está no momento da execução normal. Isso acontece uma vez a cada 1000 tentativas de adição de tags, sem nenhum padrão que eu possa detectar (ou seja, os dois números no par "329051-1827414" do exemplo de mudança)

UMA CHECK TABLE No MySQL, na tabela relevante, mostra que eles estão aparentemente bem.

Alguma ideia?

Foi útil?

Solução

Normalmente, você vê erros assim ao tentar adicionar a uma tabela intermediária, se a linha for adicionada duplica a restrição exclusiva para os FKs. Suponho que no exemplo que você forneceu "329051" é um Post ID e "1827414" é um ID de tag.

Normalmente, no Django, você pode chamar o método add () repetidamente para adicionar a mesma instância e o Django cuida de tudo para você. Suponho que o Model Manager mantenha algum estado para ajudá -lo a determinar se cada add () representa uma linha nova ou existente e se a linha parece ser nova, ele tenta uma inserção.

Isso por si só não explica por que você está recebendo o erro. Você menciona "é responsável por alguma simultaneidade nas operações do banco de dados". Sem saber o que isso significa, acho que você pode estar obtendo uma condição de corrida em que vários threads/processos estão tentando adicionar a mesma nova tag ao mesmo tempo e ambos estão tentando inserções.

Outras dicas

Acho que estou vendo um problema semelhante no meu aplicativo - se eu enviar duas solicitações idênticas para adicionar uma relação M2M (por exemplo, tag no meu caso), recebo esse erro porque a tabela M2M tem uma restrição exclusiva (Usuário, marcação). Acho que o servidor está processando as funções .add ao mesmo tempo.

if not already in database:
   # Both invocations reach here because the next line takes some time to process.
   create m2m row

Não sei como isso pode ser remediado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top