У меня есть функция, которая обновляет модель или создает новую запись, если она еще не существует:
try:
obj=model.objects.get(id=id)
setattr(obj, 'completed', True)
obj.save()
except:
model.objects.create(id=x, user=y, completed=True)
В конкретном случае эта функция вызывается вдвое быстрее, так что она создала две записи в базе данных, поэтому я включил уникальное ограничение, чтобы гарантировать, что это никогда не произойдет.
Но потом я начал получать эту ошибку:
Duplicate entry '1-13' for key 'x_y_z_uniq'
Итак, я попытался использовать блокировку как:
with transaction.atomic():
try:
obj=model.objects.select_for_update().get(id=id)
setattr(obj, 'completed', True)
obj.save()
except:
model.objects.create(id=x, user=y, completed=True)
Но сейчас поднимается эта ошибка:
(Deadlock found when trying to get lock; try restarting transaction)
Я хотел, чтобы первый вызов функции создал новую запись, а второй обновил бы эту запись, но второй вызов просто завершился неудачей из-за тупика, как я могу сделать так, чтобы второй вызов ожидал для первого, чтобы закончить?