我在一个大型项目上与django合作。
我从模型的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
?
答案 0 :(得分:2)
@ketanbhatt这可能会有所帮助
https://docs.djangoproject.com/en/1.9/ref/models/querysets/#select-for-update
在自动提交模式下使用select_for_update()在支持SELECT的后端上评估查询集... FOR UPDATE是一个TransactionManagementError错误,因为在这种情况下行不会被锁定。如果允许,这将有助于数据损坏,并且很容易通过调用期望在一个事务之外的事务中运行的代码来引起。
https://docs.djangoproject.com/en/1.9/topics/db/transactions/#managing-autocommit
当一个atomic()块处于活动状态时,Django将拒绝关闭自动提交,因为这会破坏原子性。