2016-03-30 8 views
3

Ich arbeite mit Django auf ein großes Projekt."Select_for_update" von einem atomaren Block noch TransactionManagementError

Ich rufe einen Sellerie task aus dem save eines Modells, das eine Methode aufruft, die eine andere Methode in einer Schleife aufruft. Das heißt:

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

Jetzt B() ist mit einem atomic() Dekorateur gewickelt und hat einen select_for_update Anruf in seinem Inneren.

ich immer noch TransactionManagementError('select_for_update cannot be used outside of a transaction.',)

Ich weiß nicht, warum das so ist. Ich habe getestet mit Verzögerung der Aufgabe um ein paar Sekunden, so dass die save ist verpflichtet, wenn die Aufgabe aufgerufen wird. Hat nicht geholfen.

Meine Frage ist: Warum bekomme ich eine TransactionManagementError, wenn ich bereits in einem Atomblock bin?

Antwort

2

@ketanbhatt Dies könnte

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

Auswertung eines queryset mit select_for_update() in Autocommitmodus auf Backends helfen, die ... FOR UPDATE SELECT unterstützen, ist ein TransactionManagementError Fehler, da die Zeilen nicht sind in diesem Fall gesperrt. Wenn dies zulässig ist, würde dies die Datenbeschädigung erleichtern und könnte leicht durch Aufrufen von Code verursacht werden, der erwartet, dass er in einer Transaktion außerhalb von einem ausgeführt wird.

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

Django autocommit auszuschalten, wenn ein Atom() Block aktiv ist, wird sich weigern, denn das ist die Unteilbarkeit brechen.

Verwandte Themen