2016-03-30 1 views
3

Я работаю с django в большом проекте.«select_for_update», вызываемый из атомного блока. TransactionManagementError

Я называю сельдерей task изнутри модели save модели, которая вызывает метод, который вызывает другой метод в цикле. То есть:

celery task --> function A() 
A() --> for i in range(1,100): call function B() 

Теперь B() обернут с atomic() декоратором и имеет select_for_update вызов внутри него.

Я все еще получаю TransactionManagementError('select_for_update cannot be used outside of a transaction.',)

Я не знаю, почему это происходит. Я проверил с задержкой задачи на несколько секунд, чтобы save был зафиксирован к моменту вызова задачи. Не помогло.

Мой вопрос: Почему я получаю TransactionManagementError, когда я уже в атомном блоке?

ответ

2

@ketanbhatt Это может помочь

https://docs.djangoproject.com/en/1.9/ref/models/querysets/#select-for-update

Оценка в QuerySet с select_for_update() в режиме автоматической фиксации на движков, которые поддерживают SELECT ... FOR UPDATE ошибка TransactionManagementError, потому что строки не являются заблокирован в этом случае. Если это разрешено, это упростит повреждение данных и может быть легко вызвано вызовом кода, который, как ожидается, будет выполняться в транзакции за пределами одного.

https://docs.djangoproject.com/en/1.9/topics/db/transactions/#managing-autocommit

Джанго откажет превратить автокоммит выключен, когда атомное() блок активен, потому что нарушило бы атомарность.

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