2009-09-20 15 views
10

Tengo un proyecto django en el que los valores de la base de datos deben actualizarse bastante a menudo por su cuenta. Hay un cronjob que se ejecuta para actualizar estos valores en la base de datos, pero algunas de las operaciones requieren transacciones atómicas. ¿Alguien sabe cómo hacer que un método modelo sea una transacción completa en django sin pasar por las vistas?Gestión de transacciones Django

Idealmente, me gustaría poder comenzar una transacción al comienzo de un método y confirmarla al final, y luego simplemente poder llamar a ese método desde cualquier lugar (una vista o un cronjob) con el garantizar que el método es atómico.

Si sabe cómo hacerlo, también necesito saber si la confirmación falla o no (debido a una escritura simultánea o algo así), la transacción se vuelve a intentar automáticamente, o si tendría que hacerlo manualmente detectar una excepción de falla y volver a llamar al método.

Gracias.

Respuesta

15

¿Echa un vistazo a Django's transaction docs? Especialmente el decorador @transaction.commit_on_success (source code). Confirma la transacción si la función decorada regresa sin generar una excepción. Si ocurre una excepción, realiza una reversión.

+5

Sí, esto es lo apropiado para usar. Creo que el PO estaba preocupado porque la documentación solo se refiere a estos junto con las vistas, no los métodos de los modelos, pero mirando la fuente no hay nada allí que no funcione fuera de una vista. –

+5

En realidad, hay una nota en esa página de la documentación que dice "Aunque los ejemplos a continuación usan funciones de visualización como ejemplos, estos decoradores también pueden aplicarse a funciones que no son de vista". –

+0

Gracias. ¿Tiene alguna idea de lo que sucede si se intentan escrituras simultáneas? ¿Se vuelve a intentar la transacción y, de no ser así, qué arroja? Gracias! – So8res

Cuestiones relacionadas