Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Incremento Atômico com Entity Framework


Com o Entity Framework você não pode fazer disso uma operação "atômica". Você tem os passos:
  1. Carregar entidade do banco de dados
  2. Alterar contador na memória
  3. Salvar entidade alterada no banco de dados

Entre essas etapas, outro cliente pode carregar a entidade do banco de dados que ainda possui o valor antigo.

A melhor maneira de lidar com essa situação é usar a simultaneidade otimista . Isso basicamente significa que a alteração na etapa 3 não será salva se o contador não for mais o mesmo de quando você carregou a entidade na etapa 1. Em vez disso, você receberá uma exceção que pode ser tratada recarregando a entidade e reaplicando a mudança.

O fluxo de trabalho ficaria assim:
  • No Work entidade o WordCount A propriedade deve ser marcada como um token de simultaneidade (anotações ou API Fluent no caso de Code-First)
  • Carregar entidade do banco de dados
  • Alterar contador na memória
  • Chame SaveChanges em um try-catch bloquear e capturar exceções do tipo DbUpdateConcurrencyException
  • Se ocorrer uma exceção, recarregue a entidade no catch bloco do banco de dados, aplique a alteração novamente e chame SaveChanges novamente
  • Repita a última etapa até que não ocorra mais nenhuma exceção

Em esta resposta você pode encontrar um exemplo de código para este procedimento (usando DbContext ).