Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 14, 2009 11:38:04

presidentua
От:
Зарегистрирован: 2009-03-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Сколько строк затронул UPDATE

Столкнулся с такой проблемой. Есть многопоточная система и очереди что обрабатывают виртуальные машины. И вот поидее мне в начале очереди нужно проапдейтить одну запись, и изменить ее состояние на “ЗАНЯТО”, чтобы никакая другая очередь не начала обработку именно этой виртуальной машины.
Тоесть мне нужно сделать update одной записи, и при этом знать, что он прошел отлично:

UPDATE VirtualMachine
SET status = WORK
WHERE status = FREE
LIMIT 1
И после этого нужно узнать, сколько столбцов было затронуто - или 0 или 1.

Я сначала думал что-то такое…
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')
Но ведь LIMIT нету, да и я update не возвращает количество строк что были затронуты.

Сейчас приблизительно такое(без try инструкций)
vm = VirtualMachine.objects.filter(
status=VirtualMachine.STATUS_FREE,
)[0]
vm.status = VirtualMachine.STATUS_WORK
vm.save()
Работает, но плохо потому что между первой выборкой при апдейте может пройти апдейт с другого треда…

Подскажите пожалуйста как это можно реализовать на Django Model API!

Или это можно решить лишь используя транзанкции? Но транзанкции не очень нравяться, потому что я могу в этой функции долго ждать, пока машина освободиться - и тем самым буду постоянно включать и выключать транзанкции.

Спасибо



Офлайн

#2 Дек. 15, 2009 19:05:24

presidentua
От:
Зарегистрирован: 2009-03-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Сколько строк затронул UPDATE

Перешел на уровень “raw SQL queries” - там все что указано мною, достаточно эфективно решилось :).

Так что как мне подсказали “Model API is good, but raw sql is god” :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version