web-dev-qa-db-fra.com

Entity Framework et niveau d'isolement des transactions

J'utilise Entity Framework 4.0. Maintenant, je dois restreindre l'accès à une table pendant que je la lis ou que j'écris dessus. Il s'agit probablement du niveau d'isolement des transactions.

Comment je fais ça?

Mise à jour

voici ce que j'ai

using (var db = new MyDb())
{
    using (TransactionScope scope = new TransactionScope())
    {
        var item = db.MyItems.Single(x => x.Id == 5);
        item.Price = 12;
        db.SaveChanges();
        scope.Complete(); 
    }
}

Cependant, lorsque je mets un point d'arrêt sur une ligne à l'intérieur de using (TransactionScope scope et lorsque je m'arrête là-bas, puis je vais dans Sql Server Management Studio et je fais une requête de sélection (ou même une mise à jour!) à partir d'une table qui utilise une transaction, je ne reçois pas d'erreur pour une raison quelconque. Mais pourquoi? Il ne doit pas me permettre de lire des données pendant l'exécution d'une transaction.

24
Alan Coromano

Par défaut, une transaction a un IsolationLevel de sérialisable. Sérialisable est le niveau le plus élevé. Cela nécessite que la transaction se termine avant que toute autre transaction ne soit autorisée à opérer sur les données.

Il a les restrictions suivantes:

  • Les relevés ne peuvent pas lire les données modifiées mais non encore validées par d'autres transactions.
  • Aucune autre transaction ne peut modifier les données qui ont été lues par la transaction actuelle tant que la transaction actuelle n'est pas terminée.
  • Les autres transactions ne peuvent pas insérer de nouvelles lignes avec des valeurs de clé qui tomberaient dans la plage de clés lues par les instructions de la transaction en cours jusqu'à ce que la transaction en cours se termine.

Ceci est un excellent article de blog qui explique comment utiliser les transactions avec Entity Framework: exemples de portée des transactions Entity Framework

MISE À JOUR

Dans Entity Framework 6, le IsolationLevel par défaut est remplacé par READ_COMMITTED_SNAPSHOT pour les bases de données créées à l'aide de Code First, ce qui permet potentiellement plus d'évolutivité et moins de blocages. Voir future spécification de EF 6

30
Wouter de Kort