none
Comment éviter un blocage dans les applications Entity Framework

    Discussion générale

  •  

    Entity Framework n’introduit pas implicitement les transactions pour les requêtes. Il présente seulement une transaction locale sur SaveChanges (sauf si une System.Transactions.Transaction est détectée et dans ce cas cette transaction est utilisée). En cette situation, comment pouvons-nous éviter ou réduire les blocages dans les applications Entity Framework ?

    Le niveau d'isolement par défaut de SQL Server est en fait READ COMMITTED, qui par défaut utilise les verrous partagés sur les lectures qui peuvent potentiellement causer un verrouillage, mais les verrous sont libérés lorsque chaque instruction est terminée. Il est possible de configurer une base de données SQL Server afin d'éviter le blocage quand on lit les données en utilisant READ COMMITTED en définissant l'option READ_COMMITTED_SNAPSHOT a ON (voir cette page MSDN pour savoir plus).

    Dans la plupart des cas, chaque requête individuelle d’EF s'exécute dans sa propre transaction auto-validation et SaveChanges s'exécute à l'intérieur d'une transaction locale avec l'isolement READ COMMITTED.

    De toute façon, EF a été conçu pour fonctionner très bien avec System.Transactions. Le niveau d'isolement par défaut pour System.Transactions.Transaction est Serializable. Cela signifie que si vous utilisez TransactionScope ou CommitableTransaction vous optez par défaut pour le niveau d'isolation le plus restrictif, et vous pouvez vous avoir beaucoup de verrouillages. Mais, ce défaut peut être facilement remplacé : par configurer un Snapshot, par exemple, à l'aide de TransactionScope, vous pouvez faire quelque chose comme ceci :

    using (var scope = new TransactionScope(TransactionScopeOption.Required, new 
    	TransactionOptions { IsolationLevel= IsolationLevel.Snapshot }))
    	{
    		// do something with EF here
    		scope.Complete();
    	}

    Pour en savoir plus je vous invite lire les articles « Tips to avoid deadlocks in Entity Framework applications » et « Deadlocks in Entity Framework ».

    mercredi 4 avril 2012 13:27