Domanda

Ho un relativamente semplice app Django, con un utilizzo abbastanza pesante che è responsabile per un bel po concorrenza nelle operazioni db.

Ho un modello post con un M2M ad un modello di tag.

Una singola riga nel mio codice, p.add(t) viene ripetutamente causando eccezioni mysql (dove p è un'istanza Post e t è un'istanza di tag.)

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

Quando questo viene sollevato posso eseguire manualmente questo p.add(t) successo, quindi deve avere a che fare con uno stato particolare che il db / app sono al momento dell'esecuzione normale. Succede circa una volta ogni 1000 tentativi tag-aggiunta, senza alcun modello che possa rilevare (cioè entrambi numeri nella "329.051-1.827.414" coppia di variazione esempio)

Un CHECK TABLE in mysql sulle pertinenti tabella mostra che essi sono tutti apparentemente OK.

Tutte le idee?

È stato utile?

Soluzione

Di solito si vede che errori come quando si cerca di aggiungere una tabella intermedia se la riga di essere duplicati aggiunto il vincolo univoco-insieme per il FK del. Sto indovinando che nell'esempio che hai fornito "329.051" è un ID Post e "1.827.414" è un ID tag.

Normalmente in Django è possibile chiamare il metodo add () più volte per aggiungere la stessa istanza e Django si prende cura di tutto per voi. Sto assumendo il manager modello mantiene uno stato per aiutarlo a determinare se ogni add () rappresenta una riga nuova o esistente e se la riga sembra essere nuovo tenta un inserto.

Che di per sé non spiega il motivo per cui si sta ottenendo l'errore. Lei parla di "è responsabile per un po 'di concorrenza nelle operazioni db.". Senza sapere che cosa significa, sto cercando di indovinare che si potrebbero ottenere una condizione di competizione in cui più thread / processi stanno cercando di aggiungere lo stesso nuovo tag intorno allo stesso tempo ed entrambi sta tentando inserti.

Altri suggerimenti

Credo che sto vedendo un problema simile nella mia app - Se invio di due richieste identiche per aggiungere una relazione m2m (ad esempio tag nel mio caso pure), ottengo questo errore perché la tabella M2M ha un vincolo univoco su (utente, tag). Sto indovinando il server sta elaborando la funzioni .add al tempo stesso .

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

Non so come questo si può rimediare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top