народ, есть проблема и не могу ее решить.
Делаю API для моб приложения и в нем есть история поиска по городам. Необходимо, что б два подряд одинаковых поиска - не дублировались в БД.
Есть такая штука:
city = City.objects.distance(ref_pnt).order_by('distance')[0]
try:
h = History.objects.filter(user=request.user).latest('timestamp')
except History.DoesNotExist:
History.objects.create(user=request.user, city=city)
else:
if not h.city == city:
History.objects.create(user=request.user, city=city)
И вроде код не гениальный и работает, но вот такой нюанс. Приложение имеет баг, в данную секунду и присылает одновременно два запроса на поиск. Разница во времени между запросами - тысячная доля секунды:
<History: 2015-12-26 09:17:27.335227+00:00 Texas City>
<History: 2015-12-26 09:17:27.334384+00:00 Texas City>
как я подозреваю, происходит гонка данных, два запроса одновременно обрабатываются и оба получаю, что последний запрос был не такой и одновременно создаются две записи. Это афигеть как не приятно и я не знаю как пофиксить. Можно как-то запретить на уровне БД(postres) создание двух практически одинаковых записей(разница во времени)? или как это вообще можно пофиксить?
зы: код выше работает, если совершить еще раз такой поиск через некоторое время(ну, через секунд).. но при первом поиске по городу - сразу создает две записи. Фиксить только в приложении? Гонка, блин, данных
Updated 26 Dec. 2015, 12:46 by wdstrm.