Come posso risolvere questo problema MySQL / InnoDB deadlocking in un ambiente non-blocking?

StackOverflow https://stackoverflow.com/questions/870097

  •  22-08-2019
  •  | 
  •  

Domanda

Stiamo utilizzando MySQL con Storage Engine InnoDB. Abbiamo un ambiente "evented", che invia più richieste simultanee su un tavolo. In pratica, funziona in questo modo: Abbiamo una funzione find_or_insert che lo fa: - trova() -> il risultato, se vuota -> Inserisci -> il risultato find ()

Stiamo utilizzando un driver di MySQL non-blocking, in modo sostanzialmente, quando iniziamo questo piccolo algoritmo più di una volta, allo stesso tempo, si corre tutti i reperti prima di inserire il primo risultato ... etc.

Purtroppo, otteniamo questi errori: "Stallo trovato quando si cerca di ottenere il blocco; provare a riavviare transazione"

Chiunque può aiutare in questo?

[EDIT]: Inoltre, io in realtà non capisco perché dovrebbe MySQL bisogno di bloccare il tavolo solo per inserire un nuovo elemento qui. Inizialmente ho però l'auto-incremento era il colpevole qui, quindi ho rimosso ... bu ancora ottengo l'errore. C'è un modo per evitare che MySQL per bloccare la tabella su inserti?

È stato utile?

Soluzione

Prova il mysql manuale di riferimento per la diagnosi e risolvere. Sembra che si sta facendo una cache. Una probabile ragione potrebbe essere che un sacco di clienti in concomitanza colpito il tavolo cercando di creare la 'prima versione' (cioè ha colpito la 'se inserto vuoto'). Forse si potrebbe aggiungere un ritardo pseudo-casuale o coordinare i creatori in modo che non si ottiene un sacco di creare chiamate simultanee al db?

EDIT: Hai visto questa pagina ? Sembra che è necessario impostare una impostazione per disabilitare le serrature per-tavolo con InnoDB my.cnf. Quello che principalmente stavo suggerendo però, era che il test potrebbe non essere rappresentabile in quanto può contenere un molto più alti scrittori percentuali che in una situazione realistica. Se si inizia a 100 thread con una tabella vuota sarebbero stati tutti immediatamente bloccare sul creare (anche per lo stesso valore, forse). Questo è molto peggio che in una situazione media cui si ha una migliore diffusione delle chiavi, un minor numero di incidenti e una percentuale molto più elevata di letture. Se questo è il comportamento previsto (cioè si avrebbe questo comportamento dal vivo), vorrei suggerire l'aggiunta di una strategia di backoff nelle dichiarazioni creare.

Altri suggerimenti

È necessario queste richieste accada una alla volta, così forse smettere di usare quel driver non-blocking. O implementare il proprio meccanismo di blocco. Attendere uno a finire prima di passare a quello successivo.

havent ha detto che questo è irragionevole, o che per qualche motivo hanno bisogno di queste cose per muoversi lungo così in fretta.

sto cambiando la mia risposta a riflettere sul fatto che la questione è rivisto. Sembra ora che questo è solo un problema con gli inserti concorrenti, non è una dipendenza sul comportamento di ricerca.

E 'la mia comprensione che InnoDB non fila blocco su inserti e non è possibile disattivare questa funzione. Tuttavia non è [modifica] sono in grado di utilizzare INSERT DELAYED. Ho appena letto questo non è disponibile su InnoDB.

http://dev.mysql.com/doc /refman/5.0/en/insert-delayed.html

Forse un esplicito LOCK TABLES attorno a tutte le vostre operazioni di scrittura collettiva saranno ignorare il comportamento di blocco predefinito. Se non ci sono altre operazioni sul tavolo durante l'intervallo quando si verificano gli eventi di scrittura, questo potrebbe funzionare.

http://dev.mysql.com/doc /refman/5.0/en/lock-tables.html

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