2012-08-29 7 views
8

que tienen algo así como:¿select_for_update libera el bloqueo en el primer save() o al final de la vista?

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

newsletter.send() 

Entonces se dio en una condición de carrera en la que estaba enviando duplicados, presumiblemente debido a que Enviar estaba siendo golpeado() por dos trabajos de cron. Lo que me lleva a pensar que la cerradura se libera en el primer guardado, mientras que pensé que no se soltaría hasta el final de la vista.

Se lanzó al primer guardado, ¿no?

+0

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

+0

@pst He leído que, en particular el https://docs.djangoproject.com/en/dev/ref/models/querysets/# select-for-update. –

Respuesta

10

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

de transacción por defecto de Django comportamiento

comportamiento predeterminado de Django es correr con una transacción abierta que se compromete de forma automática cuando los hay, la función de modelo que altera los datos incorporados se llama. Por ejemplo, si llama a model.save() o model.delete(), el cambio se confirmará de inmediato.

+1

Supongo que la respuesta a la pregunta original es un "sí"? – minghan

+2

@ mh512 sí :). –

Cuestiones relacionadas