Sto usando Laravel 5.1.Come evitare il problema dei blocchi delle tabelle dei DB durante l'uso delle code Laravel?
Le code vengono utilizzate per il recupero/sincronizzazione dei dati tra diversi sistemi.
Uso il driver del database, 3 processi "artisan queue: work --daemon" sono in esecuzione in ogni momento.
I lavori vengono inviati sia dagli utenti di sistema che dallo scheduler (cron). Tre code vengono utilizzate per stabilire la priorità dei lavori.
Tutto sembra funzionare correttamente: la tabella dei lavori viene riempita di record, il sistema si occupa di loro e rimuove quelli che sono stati eseguiti.
questioni Tuttavia, dopo un certo tempo di bloccaggio cominciano ad interferire:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
e
'RuntimeException' with message 'Can't swap PDO instance while within transaction.'
e
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
Non ho provato utilizzando un altro driver coda ancora. Mi piacerebbe molto stare con il database però. Il motore è InnoDB, la tabella dei lavori ha struttura e indici predefiniti.
C'è un modo per risolvere questo problema? Quali sono i tuoi pensieri?
Vale la pena ricordare che chiamo lo DB::reconnect()
all'interno delle mie classi di lavoro poiché i lavoratori della coda sono in esecuzione come demoni.
I lavori vengono inviati utilizzando il tratto DispatchesJobs
come ci si aspetterebbe. Non interferisco nell'algoritmo delle code in nessun altro modo.
Qualsiasi soluzione per questo? –
No. Spostato in beanstalkd per ora. Anche se mi è piaciuto il driver DB perché potevo tenere traccia dei lavori e dei lavori falliti semplicemente guardando le tabelle DB ... – MaGnetas
Studia come Laravel si occupa delle "transazioni" di MySQL. Sembra che tu abbia iniziato una transazione, quindi ti sei seduto per molto tempo. Transazioni 'COMMIT' non appena possibile. Controlla l'uso di 'autocommit'. –