Korzystanie Django na bazie danych MySQL pojawia się następujący błąd:Unikanie MySQL impas w Django ORM
OperationalError: (1213, 'Deadlock found when trying to get lock; try restarting transaction')
Usterka wzrasta w poniższym kodzie:
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()
Mam kilka parallell procesy pracy na w tej samej bazie danych, a czasem mogą mieć to samo zadanie lub nakładać się w przykładowych danych. Dlatego muszę wyczyścić bazę danych, a następnie zapisać nowe próbki, ponieważ nie chcę żadnych duplikatów.
Uruchamiam całą sprawę w bloku transakcji with transaction.commit_on_success()
i otrzymuję wyjątek OperationalError
dość często. Wolałbym, aby transakcja nie zakończyła się impasem, ale zamiast tego po prostu blokuje i czeka na zakończenie drugiego procesu.
Z tego, co przeczytałem, powinienem zamówić zamki poprawnie, ale nie jestem pewien jak to zrobić w Django.
Jaki jest najprostszy sposób, aby upewnić się, że nie otrzymuję tego błędu, a jednocześnie upewnić się, że nie utracę żadnych danych?
Właśnie wypróbowałem 'select_for_update()' (i '__range'), ale wciąż widzę zakleszczenia. N.b. 'samples' nie pochodzi z bazy danych, ale pochodzi z rzeczywistego zadania przetwarzania. Baza danych jest właśnie używana do przechowywania niektórych informacji zebranych ze znacznie większego zbioru danych. – gurglet
Zaktualizowałem odpowiedź. – catavaran