Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przyrost atomowy z Entity Framework

W przypadku Entity Framework nie można uczynić tej operacji "atomową". Masz kroki:

  1. Załaduj jednostkę z bazy danych
  2. Zmień licznik w pamięci
  3. Zapisz zmienioną jednostkę w bazie danych

Pomiędzy tymi krokami inny klient może załadować jednostkę z bazy danych, która nadal ma starą wartość.

Najlepszym sposobem radzenia sobie z tą sytuacją jest użycie optymistycznej współbieżności . Zasadniczo oznacza to, że zmiana w kroku 3 nie zostanie zapisana, jeśli licznik nie będzie już taki sam, jak podczas ładowania encji w kroku 1. Zamiast tego otrzymasz wyjątek, który możesz obsłużyć, ponownie ładując encję i ponowne zastosowanie zmiany.

Przepływ pracy wyglądałby tak:

  • W Work podmiot WordCount właściwość musi być oznaczona jako token współbieżności (adnotacje lub Fluent API w przypadku Code-First)
  • Załaduj jednostkę z bazy danych
  • Zmień licznik w pamięci
  • Zadzwoń do SaveChanges w try-catch blokuj i łap wyjątki typu DbUpdateConcurrencyException
  • Jeśli wystąpi wyjątek, przeładuj encję w catch bloku z bazy danych, zastosuj zmianę ponownie i wywołaj SaveChanges ponownie
  • Powtórz ostatni krok, aż nie będzie już wyjątku

W tej odpowiedzi możesz znaleźć przykładowy kod dla tej procedury (używając DbContext ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy możesz wykonać pętlę For Each Row za pomocą MySQL?

  2. MySql z błędem JAVA. Ostatni pomyślnie wysłany pakiet do serwera był 0 milisekund temu

  3. pdo wstawia obraz bezpośrednio do bazy danych - zawsze wstawia BLOB - 0B

  4. Prawdziwy łańcuch ucieczki i PDO

  5. Jak zainstalować MySQLdb (biblioteka dostępu do danych Pythona do MySQL) na Mac OS X?