Mam serwer MySQL, do którego uzyskuję dostęp za pomocą Entity Framework 4.0. W bazie danych mam tabelę o nazwie Działa, w której niektóre się liczą. Tworzę stronę internetową za pomocą Asp.net. Ta tabela jest dostępna dla jeszcze jednego użytkownika w tym samym czasie. I ta sytuacja powoduje problem z nieprawidłowym wykryciem.Atomowy przyrost z Entity Framework
Mój kod tak:
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);
Jeśli ktoś więcej niż dostęp wątku w tym samym czasie w bazie, tylko ostatnie zmiany pozostają.
Prąd wyjściowy:
t1 Temat: One - t2: Temat Dwa
t1: praca Dostęp
t2: praca Dostęp
t2: Access nie jest null
t1: Dostęp nie jest pusty
t1: Ilość zmienił
t2: Ilość zmienił
T1: Zapisz zmiany
T2: Save changes
T1: Aktualna ilość: 5
t2: bieżącego liczenia : 5
Oczekuje wyjściowa:
t1: praca Dostęp
t2: praca Dostęp
t2: Access nie jest null
t1: Dostęp jest not null
t1: Ilość zmienił
t2: Liczba zmienna
t1: Zapisz zmiany
T2: Zapisz zmiany
t1: Aktualna ilość: 5
T2: Aktualna ilość: 10
wiem dlaczego apeear tego problemu, ponieważ ten kod nie jest atomowy. Jak mogę zmienić działanie atomowe?
Wiem, że w MsSql możesz mieć transakcje, czy możesz zrobić to samo w MySql? Również wiem, że 'SaveChanges()' pozwala na wartość logiczną, ale nie sądzę, że to pomoże w tym przypadku. – gunr2171
możesz spróbować tego, 'lock (currentWork) { Console.WriteLine (" Dostęp nie jest pusty "); currentWork.WordCount + = 5; // Domyślny WordCount to 0 Console.WriteLine ("Count changed"); myEntity.SaveChanges(); Console.WriteLine ("Zapisz zmiany"); } 'minęło trochę czasu, od kiedy zrobiłem przyzwoity wątek – Armand
Aha, i przy okazji: dobra sztuczka. Możesz umieścić warunek 'where' w swoim' pierwszym lub domyślnym 'i całkowicie usunąć' where'. – gunr2171