2012-08-29 4 views
8

Ich habe so etwas wie:Gibt select_for_update die Sperre beim ersten Speichern() oder am Ende der Ansicht frei?

newsletter = Newsletter.select_for_update().latest() 
newsletter.started_sending = timezone.now() 
newsletter.save() 

newsletter.send() 

Dann traf es eine Race-Bedingung, wo ich Duplikate sendete, vermutlich weil send() wurde von zwei Cronjobs getroffen. Was mich zu der Annahme bringt, dass das Schloss beim ersten Speichern freigegeben wird, wo ich dachte, es würde erst am Ende der Ansicht loslassen.

Es ist beim ersten Speichern freigegeben, oder?

+0

https://docs.djangoproject.com/en/dev/ref/models/querysets/ –

+0

@pst ich gelesen habe, dass insbesondere die https://docs.djangoproject.com/en/dev/ref/models/queriesets/# Aktualisierungsbereich auswählen. –

Antwort

10

Von https://docs.djangoproject.com/en/dev/topics/db/transactions/#topics-db-transactions-requirements

Djangos Standard-Transaktionsverhalten

Djangos Standard-Verhalten mit einer offenen Transaktion auszuführen, die es automatisch verpflichtet, wenn eine eingebaute, Daten verändernde Modelle Funktion aufgerufen wird. Wenn Sie beispielsweise model.save() oder model.delete() aufrufen, wird die Änderung sofort übernommen.

+1

Ich denke, die Antwort auf die ursprüngliche Frage ist ein "Ja"? – minghan

+2

@ mh512 ja :). –

Verwandte Themen