2016-03-30 11 views
3

私は大きなプロジェクトでdjangoを使っています。アトミックブロックから "select_for_update"がまだ呼び出されましたTransactionManagementError

ループ内で別のメソッドを呼び出すメソッドを呼び出すモデルの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

答えて

2

行はありませんので、

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

Djangoはそれが原子性を壊すので、アトミック()ブロックは、アクティブなときに自動コミットをオフにすることを拒否します。

関連する問題