Possiedo un server MySQL a cui accedo utilizzando Entity Framework 4.0. Nel database ho un tavolo chiamato Works in cui alcuni conti. Sviluppo sito web con Asp.net. Questa tabella accelera un altro utente nello stesso momento. E questa situazione causa problemi di incesto errati.Incremento atomico con Entity Framework
Il mio codice del genere:
dbEntities myEntity = new dbEntities();
var currentWork = myEntity.works.Where(xXx => xXx.RID == 208).FirstOrDefault();
Console.WriteLine("Access work");
if (currentWork != null)
{
Console.WriteLine("Access is not null");
currentWork.WordCount += 5;//Default WordCount is 0
Console.WriteLine("Count changed");
myEntity.SaveChanges();
Console.WriteLine("Save changes");
}
Console.WriteLine("Current Count:" + currentWork.WordCount);
Se uno in più l'accesso al database filo stesso tempo, solo le ultime modifiche rimangono.
Corrente di uscita:
t1 Discussione: One - t2: Discussione Due
t1: il lavoro di accesso
t2: lavoro Accesso
t2: L'accesso non è null
t1: L'accesso non è nullo
t1: Conte ha cambiato
t2: COUNT cambiato
T1: Salva le modifiche
t2: Salva modifiche
t1: Count attuale: 5
t2: conteggio attuale : 5
Uscita prevista:
t1: il lavoro di accesso
t2: lavoro Accesso
t2: L'accesso non è nullo
t1: L'accesso non è nullo
t1: COUNT cambiato
t2: conteggio modificato
t1: Salva modifiche
t2: Salva modifiche
t1: Count attuale: 5
t2: Count attuale: 10
so perché apeear questo problema, perché questo codice non è atomico. Come posso attivare l'operazione atomica?
So che in MsSql puoi avere transazioni, puoi fare lo stesso in MySql? So anche che 'SaveChanges()' consente un valore booleano, ma non credo che ciò possa aiutare in questo caso. – gunr2171
puoi provare questo, 'lock (currentWork) { Console.WriteLine (" Access is not null "); currentWork.WordCount + = 5; // Default WordCount è 0 Console.WriteLine ("Conteggio modificato"); myEntity.SaveChanges(); Console.WriteLine ("Salva modifiche"); } 'è da un po 'che ho fatto una discreta filettatura – Armand
Oh, e comunque: un buon trucco. Puoi mettere la tua condizione 'where' all'interno del tuo' primo o predefinito' e rimuovere 'where' completamente. – gunr2171