J'ai un serveur MySQL auquel j'accède en utilisant Entity Framework 4.0. Dans la base de données j'ai une table appelée Works dans laquelle certains compte. Je développe un site web avec Asp.net. Cette table accésable un utilisateur de plus en même temps. Et cette situation provoque un mauvais problème d'incertions.Incrément atomique avec Entity Framework
Mon code comme ça:
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);
Si un de plus que l'accès à la base de données fil en même temps, seules les dernières modifications restent.
Courant de sortie:
t1: Discussion Un - t2: Discussion Deux
t1: Travaux d'accès
t2: Travaux d'accès
t2: l'accès est non nul
t1: L'accès n'est pas nul
t1: Nombre changé
t2: Nombre changé
t1: Enregistrer les modifications
t2: Enregistrer les modifications
t1: nombre actuel: 5
t2: nombre actuel : 5
Résultats escomptés:
t1: Travaux d'accès
t2: Travaux d'accès
t2: L'accès est non nul
t1: L'accès est non nul
t1: Nombre changé
t2: Nombre modifié
t1: Enregistrer les modifications
t2: Enregistrer les modifications
t1: nombre actuel: 5
t2: nombre actuel: 10
Je sais pourquoi apeear ce problème, car ce code n'est pas atomique. Comment puis-je tourner opération atomique?
Je sais dans MsSql vous pouvez avoir des transactions, pouvez-vous faire la même chose dans MySQL? Aussi je sais que 'SaveChanges()' permet un booléen, mais je ne pense pas que cela aidera dans ce cas. – gunr2171
pouvez-vous essayer ceci, 'lock (currentWork) { Console.WriteLine (" Accès n'est pas nul "); currentWork.WordCount + = 5; // WordCount par défaut est 0 Console.WriteLine ("Count changed"); myEntity.SaveChanges(); Console.WriteLine ("Enregistrer les modifications"); } 'ça fait un moment que j'ai fait du filetage décent – Armand
Oh, et en passant: une bonne astuce. Vous pouvez placer votre condition 'where' dans votre' first ou default' et supprimer complètement 'where'. – gunr2171