J'ai le code pseduo suivant dans certains projets Repository Pattern qui utilise EF4.Comment dois-je gérer cette erreur Optimistic Concurrency dans ce code Entity Framework, j'ai?
public void Delete(int someId)
{
// 1. Load the entity for that Id. If there is none, then null.
// 2. If entity != null, then DeleteObject(..);
}
assez simple, mais je reçois une erreur d'exécution: -
ConcurrencyException: Store, Update, Insert or Delete statement affected an unexpected number of rows (0).
Maintenant, voici ce qui se passe: -
- Deux instances de EF4 sont en cours d'exécution INTHE application en même temps.
- Instance A appelle la suppression.
- Les appels d'instance B suppriment une nano seconde plus tard.
- L'instance A charge l'entité.
- L'instance B charge également l'entité. L'instance A supprime maintenant cette entité - les bananes froides.
- L'instance B tente de supprimer l'entité, mais elle est déjà supprimée. En tant que tel, le no-count ou quoi ne pas 0, quand il attendait 1 .. ou quelque chose comme ça. Fondamentalement, il a compris que l'élément qu'il est censé supprimer, n'a pas supprimé (parce qu'il est arrivé il ya une fraction de seconde).
Je ne sais pas si c'est comme un course-condition ou quelque chose.
De toute façon, y a-t-il des trucs que je peux faire ici pour que le 2ème appel ne plante pas? Je pourrait en faire une procédure stockée .. mais j'espère éviter cela maintenant.
Des idées? Je me demande s'il est possible de verrouiller cette ligne (et cette ligne seulement) quand la sélection est appelée ... forçant l'instance B à attendre que le verrou de ligne ait été relâché. À ce moment-là, la ligne est supprimée, donc quand l'instance B est sélectionnée, les données ne sont pas là ... donc elle ne sera jamais supprimée.
Pourquoi ne pas simplement gérer l'exception de concurrence? Si l'objet a été supprimé d'un autre thread (alias l'instance EF), aucun travail ne reste pour ce thread puisque l'enregistrement a déjà été supprimé. –
C'est le problème -> les deux instances pensent avoir un objet à supprimer, car ils lisent tous les deux à partir de la BD en même temps. C'est juste que l'instance A complète la méthode DeleteObject (..) une nano seconde avant le second appel .. pour le même objet. Maintenant, je gère l'exception .. mais je me sens comme c'est éviter le vrai problème .. et je me demande si elle pourrait être traitée avec un verrouillage ou quelque chose? –