sql >> Base de Datos >  >> RDS >> Mysql

Incremento atómico con Entity Framework

Con Entity Framework no puede hacer de esto una operación "atómica". Tienes los pasos:

  1. Cargar entidad desde la base de datos
  2. Contador de cambios en la memoria
  3. Guardar entidad modificada en la base de datos

Entre estos pasos, otro cliente puede cargar la entidad desde la base de datos que aún tiene el valor anterior.

La mejor manera de lidiar con esta situación es usar concurrencia optimista . Básicamente significa que el cambio en el paso 3 no se guardará si el contador ya no es el mismo que cuando cargó la entidad en el paso 1. En su lugar, obtendrá una excepción que puede manejar recargando la entidad y volviendo a aplicar el cambio.

El flujo de trabajo se vería así:

  • En el Work entidad el WordCount la propiedad debe marcarse como token de simultaneidad (anotaciones o API fluida en el caso de Code-First)
  • Cargar entidad desde la base de datos
  • Contador de cambios en la memoria
  • Llamar a SaveChanges en un try-catch bloquear y capturar excepciones de tipo DbUpdateConcurrencyException
  • Si ocurre una excepción, vuelva a cargar la entidad en el catch bloque de la base de datos, aplique el cambio nuevamente y llame a SaveChanges otra vez
  • Repita el último paso hasta que ya no ocurra ninguna excepción

En esta respuesta puede encontrar un ejemplo de código para este procedimiento (usando DbContext ).