Задать вопрос
@1099511627776
Пишу все что интересно и на всем на чем интересно

Как сделать атомарной часть кода в django?

Здравсвуйте,
Мне нужно реализовать приблизительно такой алгоритм:
def Counter(model):
    count = model.getCount()
    count = count + 1
    model.setCount(model)

Проблем нет пока я один тестирую код, но если к нему сразу подключается много человек тогда счетчик не срабатывает т.к. в один момент времени к этому коду может обратится несколько клиентов и соответственно в model.getCount() они оба получат старое значени параметра count
Как можно защитить этот участок от одновременного обращения 2-х пользователей. Спасибо
  • Вопрос задан
  • 420 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
@IvanOne
Ситуация лично для меня не понятна, но наверно вам нужно смотреть транзакции. https://docs.djangoproject.com/en/1.8/topics/db/tr...
Ответ написан
zelsky
@zelsky
Передавать в запрос уникальньій ид пользователя куки, csrf или тому подобное
Ответ написан
sim3x
@sim3x
Лучше так
redis.io/commands/incr
но можно и так
www.postgresql.org/docs/9.1/static/datatype-numeri...

Да и вообще проблема не решаема, если не указать ограничений, тк пока будет формироваться http ответ, значение может уже измениться
Ответ написан
Комментировать
Bahusss
@Bahusss
Python Master
Вопрос одновременного доступа к данным чаще всего не имеет общего решения, которой подойдет для любого случая и нужно каждый конкретный случай рассматривать отдельно.

Для приведенного случая атомарной записи в базу пример вам уже привели. Для другого случая - будет какое-то другое решение. Если речь идет именно о совместном доступе к данным в реляционной базе, то можете попробовать поставить другой уровень изоляции транзакций, например при уровне Serializable и использовании транзакций - они все будут выполнятся последовательно и соответственно проблем с одновременным доступом не будет, но появятся новые.
Ответ написан
Комментировать
@devel787
Возможно, чем-то поможет habrahabr.ru/post/252563
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы