2017-09-22 1 views
1

Dans notre équipe de développement, nous avons une discussion intéressante concernant l'ouverture de transactions pendant les lectures dans Entity Framework.Utilisation de transactions pendant les lectures à l'aide d'Entity Framework 6+

Cas est ceci: nous avons l'unité de travail dans l'application MVC qui enjambe les méthodes d'action - simple transaction EF ouverte avant d'exécuter l'action et valide après qu'aucune erreur n'apparaît pendant l'exécution. C'est très bien et peut-être que certains d'entre vous utilisent un pattern UoW avec EF de cette façon.

La partie intéressante concerne les actions qui n'effectuent que des lectures (aucune modification d'entité, par exemple, get by id). La transaction doit-elle être ouverte aussi pour les lectures? Quelle serait la différence dans l'approche quand nous n'ouvrons pas la transaction et pendant la lecture il y a une transaction active sur la même table que nous lisons les données n'utilisant pas tran? Supposons que nous avons défini le niveau d'isolation de la transaction par défaut sur read committed.

J'ai été pro transaction d'ouverture qui maintient des lectures cohérentes, mais il y a des choses contre des transactions similaires ralentissement des lectures (ce qui est vrai, mais je ne sais pas combien).

Que pensez-vous? Je sais que certains d'entre vous répondront que les anciens architectes disent "ça dépend", mais j'ai besoin d'arguments forts qui ne détestent pas :)

Répondre

1

Pour SQL Server à l'isolation READ COMMITTED il n'y a pas de différence entre un SELECT dans une transaction et un en dehors d'un transaction. Avec l'héritage READ COMMITTED, les verrous S sont libérés à la fin de chaque requête, même dans une transaction. Avec READ COMMITTED SNAPSHOT (qui est la valeur par défaut pour EF Code First) il n'y a pas de verrous S pris, et les versions de ligne fournissent uniquement une vue à un moment donné de la base de données au niveau de l'instruction.

Lors de l'isolation SNAPSHOT, la transaction entière voyait la base de données à un point dans le temps, toujours sans verrouillage.

+0

Quelle est la différence dans la transaction d'ouverture de la performance et non la transaction d'ouverture? – Macko

+0

Si seulement des requêtes SELECT pour SQL Server à READ COMMITTED, aucune différence de performance. Aucune différence de verrouillage. Pas de différence dans les résultats. –