从原子块调用"select_for_update"仍然事务管理错误



我正在与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将拒绝关闭自动提交,因为这会破坏原子性。

相关内容

  • 没有找到相关文章

最新更新