Estoy usando MySQL con el motor InnoDB y el nivel de aislamiento REPEATABLE-READ.¿Es esta una forma segura de incrementar y obtener el valor de un contador en Django?
He escrito una función que creo que debería incrementar atómicamente un IntegerField, y darme el valor después del incremento. Me gustaría obtener opiniones sobre si mi código es robusto frente a problemas de concurrencia.
Mi código es el siguiente:
class MyModel(models.Model):
version = models.IntegerField()
@staticmethod
@transaction.commit_on_success
def acquire_version(pk):
MyModel.objects.filter(pk = pk).update(version = F('version') + 1)
return MyModel.objects.get(pk = pk).version
Mi pensamiento es que en dos llamadas simultáneas, las actualizaciones mutuamente se excluyen entre sí debido a un bloqueo de escritura, y luego REPETIBLE-LEER deben garantizar que mi posterior. get me dará el valor después de la ACTUALIZACIÓN. ¿Estoy en lo cierto?
(Esto no es un general "cómo hago un incremento atómica?" Pregunta, ya hay uno de ellos. Esto es acerca de si ésta manera particular es válido.)
¿Has mirado en http://stdbrouw.github.com/django-locking/ - Asumo que usted está haciendo esto para el bloqueo optimista – dstarh
relacionados http://stackoverflow.com/questions/1598932/atomic-increment-of-a-counter-in-django –