Mysql
 sql >> Database >  >> RDS >> Mysql

Incremento atomico con Entity Framework

Con Entity Framework non puoi fare di questa un'operazione "atomica". Hai i passaggi:

  1. Carica entità dal database
  2. Modifica contatore in memoria
  3. Salva l'entità modificata nel database

Tra questi passaggi un altro client può caricare l'entità dal database che ha ancora il vecchio valore.

Il modo migliore per affrontare questa situazione è utilizzare la concorrenza ottimistica . In pratica significa che la modifica nel passaggio 3 non verrà salvata se il contatore non è più lo stesso di quando hai caricato l'entità nel passaggio 1. Invece otterrai un'eccezione che puoi gestire ricaricando l'entità e riapplicando la modifica.

Il flusso di lavoro sarebbe simile a questo:

  • Nel Work entità il WordCount la proprietà deve essere contrassegnata come token di concorrenza (annotazioni o API Fluent in caso di Code-First)
  • Carica entità dal database
  • Modifica contatore in memoria
  • Chiama SaveChanges in un try-catch blocca e cattura eccezioni di tipo DbUpdateConcurrencyException
  • Se si verifica un'eccezione, ricaricare l'entità nel catch bloccare dal database, applicare nuovamente la modifica e chiamare SaveChanges di nuovo
  • Ripeti l'ultimo passaggio finché non si verificano più eccezioni

In questa risposta puoi trovare un esempio di codice per questa procedura (usando DbContext ).