Джанго, как сделать вид атомным? - PullRequest
1 голос
/ 20 июля 2009

У меня есть простое приложение django для имитации фондового рынка, пользователи приходят и покупают / продают. Когда они решили торговать,

  1. рыночная цена считывается, а
  2. на основании ордера на покупку / продажу рыночная цена увеличивается / уменьшается.

Я не уверен, как это работает в django, но есть ли способ сделать представление атомарным? то есть я обеспокоен тем, что действия пользователя A могут считывать цену, но до того, как она будет обновлена ​​из-за его заказа, действие пользователя B считывает цену.

Не удалось найти простое, чистое решение для этого онлайн. Спасибо.

Ответы [ 3 ]

1 голос
/ 20 июля 2009

Это транзакции базы данных с некоторыми примечаниями. Все заметки для Postgresql; все базы данных имеют механизмы блокировки, но детали разные.

Многие базы данных не делают этот уровень блокировки по умолчанию, даже если вы находитесь в транзакции. Вам необходимо получить явную блокировку данных.

В Postgresql вы, вероятно, хотите выбрать SELECT ... FOR UPDATE, который будет блокировать возвращаемые строки. Вам нужно использовать FOR UPDATE для каждого SELECT, который хочет заблокировать, если другой пользователь собирается обновить их.

К сожалению, нет способа сделать ОБНОВЛЕНИЕ в ORM Джанго. Насколько я знаю, вам нужно немного взломать ORM или использовать неформатированный SQL. Если это код с низкой производительностью и вы можете позволить сериализовать all доступ к таблице, вы можете использовать LOCK IN EXCLUSIVE MODE уровня таблицы, который будет сериализовать всю таблицу.

http://www.postgresql.org/docs/current/static/explicit-locking.html

http://www.postgresql.org/docs/current/static/sql-lock.html

http://www.postgresql.org/docs/current/static/sql-select.html

0 голосов
/ 02 июля 2014

Довольно старый вопрос, но с 1.6 вы можете использовать transaction.atomic() в качестве декоратора.

views.py

@transaction.atomic()
def stock_action(request):
  #trade here
0 голосов
/ 20 июля 2009

Оберните запросы к БД, которые читаются, и те, которые обновляются в транзакции. Синтаксис зависит от того, какой ORM вы используете.

...