Utilizzando Django su un database MySQL ottengo il seguente errore:evitare stallo MySQL in Django ORM
OperationalError: (1213, 'Deadlock found when trying to get lock; try restarting transaction')
La colpa sorge nel codice seguente:
start_time = 1422086855
end_time = 1422088657
self.model.objects.filter(
user=self.user,
timestamp__gte=start_time,
timestamp__lte=end_time).delete()
for sample in samples:
o = self.model(user=self.user)
o.timestamp = sample.timestamp
...
o.save()
Ho diversi processi parallell lavorare su lo stesso database e talvolta potrebbero avere lo stesso lavoro o una sovrapposizione nei dati di esempio. Ecco perché ho bisogno di cancellare il database e quindi memorizzare i nuovi campioni poiché non voglio duplicati.
Sto eseguendo il tutto in un blocco di transazione with transaction.commit_on_success()
e sto ottenendo l'eccezione OperationalError
abbastanza spesso. Quello che preferirei è che la transazione non finisce in un deadlock, ma invece blocca e aspetta che l'altro processo finisca con il suo lavoro.
Da quello che ho letto dovrei ordinare i blocchi correttamente, ma non sono sicuro di come farlo in Django.
Qual è il modo più semplice per garantire che non venga visualizzato questo errore assicurandomi comunque di non perdere alcun dato?
Ho appena provato 'select_for_update()' (e '__range') ma sto ancora vedendo deadlock. N.B. 'samples' non proviene dal db, ma proviene dal processo di elaborazione vero e proprio. Il db è appena usato per memorizzare alcune delle informazioni raccolte da un set di dati molto più grande. – gurglet
Ho aggiornato la risposta. – catavaran