Site de volume élevé utilisant ADO.NET TransactionScope vs ExecuteCommand sur NOLOCK, READ UNCOMMITTED directement?

StackOverflow https://stackoverflow.com/questions/628004

Question

Il suffit de lire cet article intéressant d’Omar sur son blog Linq to SQL résout le problème de blocage des transactions et de délai d'expiration des requêtes à l'aide de lectures non validées . Javed Hasan a commencé à discuter avec lui de sa solution à la situation de nolock sur un site à volume élevé.

Ici, le problème que nous essayons de résoudre est que, du point de vue de SQL, nous devons utiliser les instructions Select avec NOLOCK ou utiliser SET TRANSACTION LEVEL READ UNCOMMITTED, sinon les lignes de volume élevé dans la base de données seront verrouillées et provoqueront des erreurs. La technologie utilisée par Omar est Linq2Sql. La question est donc: comment pouvons-nous obtenir cela dans votre code d’accès aux données C # afin que ce qui précède ne se produise pas?

Dans le message, Omar utilise sa solution en testant des sites réels et des outils tels que SqlProfiler, alors que Javed Hasan utilise des documents MSDN et le blog de Scott Hanselman, etc.

.

Omar suggère d'utiliser les éléments suivants

using (var db = new DropthingsDataContext2())
{
  db.Connection.Open();
  db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");

  var user = db.aspnet_Users.First();
  var pages = user.Pages.ToList();
}

alors que Javed Hasan suggère

using (new TransactionScope(TransactionScopeOption.Required, 
  new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
 //Your db Operation
}

Je suis très intéressé de savoir ce que vous faites sur ce problème particulier sur un site à volume élevé tel que StatckOverflow, ou ce que Jeff et leurs gars ont fait à cet égard?

Modifier : après avoir lu le premier message, je tiens à souligner quelques éléments dans le message d'Omar.

  1. il a rencontré un problème de connexion avec son approche mais il l'a résolu, voir son message.
  2. plus important encore, il a mentionné avoir essayé d'utiliser la méthode ADO.NET Transaction et même ce que Scott Hanselman avait écrit sur son blog, mais cela ne fonctionne pas pour les sites à volume élevé, cela dégrade légèrement les performances. Omar a déclaré que cette opération "System.Transactions entraînait des frais généraux importants. Je n'ai jamais été capable de l'utiliser sur un site Web à volume élevé sans faire en sorte que le processeur fonctionne à 100% et que le nombre de requêtes / seconde soit réduit à 1 / 10ème. Il est conçu pour les applications d'entreprise et non pour les sites Web à volume élevé. & Quot;
Était-ce utile?

La solution

Tout d’abord, évitez les lectures non validées, elles peuvent être à l’origine de nombreux problèmes. Une meilleure solution consiste simplement à configurer la base de données sur isolation des instantanés . C’est ce que Jeff a fait .

Jeff a essentiellement déclaré: "bla bla bla, soyez vrais, bla bla bla, théoriciens des bases de données, bla bla bla, READ UNCOMMITTED peut être utile pour les applications de production REAL qui n'ont pas besoin de cohérence des données." Jeff n'est pas un administrateur de base de données, mais heureusement, il existe de nombreux administrateurs de base de données sur SO.

Le problème de l’approche d’Omar est qu’il peut y avoir des fuites dans les connexions avec " read non committed " niveau d'isolement dans votre pool de connexions, ce qui pourrait causer des ravages sur votre site Web. Signification instruction aléatoire peut être exécuté en lecture non engagée.

L’approche Javed serait bien meilleure parce que les MS disposeront de la possibilité de nettoyer la connexion.

MODIFIER Si vous rencontrez des problèmes de performances avec l'approche de Javed, vous pouvez envisager de lancer votre propre gestionnaire de transactions.

Certaines choses que vous voudrez probablement faire:

  • Détient une pile de transactions en cours
  • Confirmez que vous êtes sur le fil du créateur lorsqu'une transaction est validée
  • Réinitialiser l'isolation de transaction à son état précédent lors de l'élimination
  • Annuler la suppression si la transaction n'a pas été validée.
  • Prend en charge les annulations imbriquées.

Autres conseils

Je suis développeur dans une équipe d'outils du groupe SQL Server de Microsoft. De nombreuses applications ne sont pas extrêmement sensibles à la cohérence des transactions, en particulier si vous écrivez une application qui génère des rapports ou quelque chose dans lequel des données parfois incohérentes ne sont pas la fin du monde. Bien sûr, si vous écrivez une application financière ou quelque chose qui a une très faible tolérance aux incohérences dans les données, vous voudrez probablement explorer d'autres solutions.

Si vous choisissez d'utiliser des lectures non validées, j'ai a blogué une solution pratique à l'aide de méthodes d'extension en C #.

{Ma (mauvaise) réputation m'empêche de poster des commentaires donc je mets ceci comme réponse}

Si vous utilisez IsolationLevel via System.Transactions et créez un nouveau contexte Linq dans le bloc de transactions, SQL Server tente finalement d'appeler DTC pour coordonner la transaction. Cela m'est juste arrivé et était assez inattendu.

Ce document Présentation de System.Transactions dans le .NET Framework 2.0 par Juval Lowy explique très bien les choses et reste pleinement valide (.Net4). À lire (J'aurais aussi posté un commentaire ... si je pouvais.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top