2016-01-19 4 views
1

Я использую Django 1.7.3 в качестве моей рамки и Tastypie 0.11.1 в качестве библиотеки api для отдыха. У меня есть базовая модель с полем имени и api для создания этой модели.Django Tastypie атомная операция

Моя проблема связана с критическими разделами (условиями гонки) при попытке создать модель.

Я попытался transaction.atomic и установил ATOMIC_REQUESTS = True на уровне db, и все же, когда я отправляю два запроса в качестве расы, я получаю две одинаковые строки.

Есть ли способ гарантировать, что функция сохранения Tastypie будет атомарной? или каким-либо образом обеспечить, чтобы запросы были атомарными?

ответ

0

я должен был бы видеть:

  1. код делает вызовы API.
  2. Любые изменения, внесенные вами в ресурсы.
  3. Какой тип стека он развернут.

Если вы используете greenthreads, несколько рабочих и/или несколько серверов, возможно, что 2 запроса фактически обрабатываются не в порядке.

Я настоятельно рекомендую изменить код, чтобы не выполнять одновременные действия на удаленном ресурсе; до тех пор, пока не будет выполнен один запрос до начала следующего.

+0

Его перераспределенная система с несколькими серверами. Я не могу заблокировать его, чтобы обрабатывать только один запрос каждый раз. –

+0

Я хотел бы помочь вам, но на самом деле нечего делать. Если запросы обрабатываются не по порядку, нет ничего, что может сделать с тастипией, возможно, вы можете настроить балансировщик нагрузки и/или обратный прокси-сервер для отправки запросов на тот же сервер, что и раньше, для каждого пользователя/сеанса. Чтобы точно убедиться, что это так, вы могли бы добавить некоторое промежуточное программное обеспечение для ведения журнала, которое добавляет заголовок X с текущей меткой времени в миллисекундах или более высокой точностью. Я также не понимаю, почему вы не можете сделать один запрос за другим. –

0

То, что я делал в таких случаях, особенно там, где save_m2m участвует, является переопределение dispatch метода моего класса-ModelResource:

from django.db import transaction 

def dispatch(self, request_type, request, **kwargs): 
    with transaction.atomic(): 
     return super(UsersResource, self).dispatch(request_type, request, **kwargs) 

dispatch называется Джанго, чтобы справиться с полным циклом, так как все преуспевает или транзакции возвращаются.

Смежные вопросы