2015-07-28 4 views
0

я иметь следующее состояние:Джанго единственна, если условие

пользователь А «взяли под контроль» ресурсного R

мне нужно, чтобы убедиться, что никто не будет иметь доступ на R, пока ADMIN говорят

его нормально использовать его.

то, что я есть сейчас:

когда пользователь взять под контроль R я сохранить флаг в БД. (Флаг связан с

R - если его верно, то R принимается)

Проблема заключается в том, что если 2 пользователи пытаются получить R в ту же секунду, может быть

ситуация, когда они оба получают R (из-за синхронизации потоков).

как я могу предотвратить это?

ответ

3

Без каких-либо образцов кода трудно точно ответить на ваш вопрос.

Тем не менее, я думаю, что вы хотите что-то вроде этого:

num_updated = Resource.objects.filter(id=1, is_taken=False).update(is_taken=True) 
was_taken = (num_updated == 1) 

Это позволит создать единый атомный запрос к базе данных. Если is_taken является False, он будет установлен в True и возвращаемое значение будет равно 1. Если ресурс уже занят, но, ни одна строка не будет соответствовать и возвращаемое значение будет равно 0.

Это должно быть свободным от гонки (по крайней мере, он будет в PostgreSQL, используя значение изоляции Read Committed.)