我正在与django合作一个大型项目。
我从调用循环中另一个方法的模型的save
内部调用一个芹菜task
。即:
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
@ketanbhatt这可能有助于
https://docs.djangoproject.com/en/1.9/ref/models/querysets/#select-用于更新
在支持select的后端以自动提交模式使用select_for_update()评估查询集。。。FOR UPDATE是TransactionManagementError错误,因为在这种情况下没有锁定行。如果允许,这将有助于数据损坏,并且很容易由调用期望在事务之外的事务中运行的代码引起。
https://docs.djangoproject.com/en/1.9/topics/db/transactions/#managing-自动提交
当atomic()块处于活动状态时,Django将拒绝关闭自动提交,因为这会破坏原子性。