Quelle est la meilleure façon de gérer une application dans la concurrence d'accès de base de données?

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

Question

Il y a quelque temps, je l'ai écrit une application utilisée par plusieurs utilisateurs pour gérer la création de métiers. Je ne l'ai pas fait le développement depuis un certain temps, et je ne me souviens pas comment je la concurrence entre les utilisateurs. Ainsi, je cherche des conseils en termes de design.

La demande initiale avait les caractéristiques suivantes:

  • Un client lourd par utilisateur.
  • Une base de données unique.
  • L'accès à la base de données pour chaque utilisateur d'insérer / mise à jour / suppression métiers.
  • Une grille dans la demande reflétant la table des métiers. Cette grille étant mis à jour chaque fois que quelqu'un change un accord.
  • J'utilise WPF.

Voici ce que je me demande:

  1. Suis-je raison de penser que je ne devrais pas se soucier de la connexion à la base de données pour chaque application? Considérant qu'il ya un singleton dans chaque, je me attends à une connexion par client sans problème.

  2. Comment puis-je faire pour empêcher l'accès des accès concurrents? Je suppose que je devrais verrouiller lors de la modification des données, mais ne me souviens pas comment.

  3. Comment puis-je configurer la grille pour mettre à jour automatiquement chaque fois que ma base de données est mise à jour (par un autre utilisateur, par exemple)?

Merci d'avance pour votre aide!

Était-ce utile?

La solution

  1. Pensez à tirer parti Pooling de connexion pour réduire Nombre de connexions. Voir: http://msdn.microsoft.com/en-us/library/8xx3tyca .aspx

  2. verrouillage le plus tard possible et la libération le plus rapidement possible afin de maximiser la concurrence. Vous pouvez utiliser TransactionScope (voir: http://msdn.microsoft. com / fr-fr / bibliothèque / system.transactions.transactionscope.aspx et http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx ) si vous avez plusieurs actions db qui doivent aller de pair pour gérer la cohérence ou tout simplement les gérer dans DB stockées proc. Gardez votre simple requête. Suivez les conseils suivants pour comprendre comment le travail de verrouillage et la façon de réduire les conflits de ressources et de l'impasse: http: // www .devx.com / gethelpon / 10MinuteSolution / 16488

  3. Je ne suis pas sûr que d'autres db, mais pour SQL, vous pouvez utiliser SQL dépendance, voir http://msdn.microsoft.com/en-us/library/a52dhwx7 (v = vs.80) .aspx

Autres conseils

Concurrency est généralement accordée par le SGBD à l'aide de verrous. Les verrous sont un type de sémaphores qui accorde le verrou exclusif à une certaine ressource et permettre à d'autres accès à limiter ou mis en attente (seulement limité dans le cas où vous utilisez lit UNCOMMITED).

Le nombre de connexions lui-même ne pose pas de problème alors que vous n'êtes pas atteindre des hauteurs où vous pourriez toucher sur les max_connections paramètres de votre SGBD. Sinon, vous pourriez obtenir un problème de connexion à des fins d'entretien ou pour l'arrêter.

DBMSes utilisent généralement un concept soit de verrous de table (MyISAM) ou les verrous de ligne (InnoDB, la plupart des autres DBMSes). Le type de serrure détermine le volume de la serrure. Verrous de table peut être très rapide, mais sont généralement considérés comme inférieurs à la ligne de serrures niveau.

verrous de niveau ligne se produisent dans une transaction (implicite ou explicite). Lors du démarrage manuellement une transaction, vous commencez votre champ de transaction. Jusqu'à ce que vous fermez manuellement le champ de transaction, toutes les modifications apportées seront les attributs à cette transaction exacte. Les modifications apportées obéira aussi à la ACID paradigme .

portée de transaction et comment l'utiliser est un sujet beaucoup trop longtemps pour que cette plate-forme, si vous voulez, je peux poster des liens qui portent plus d'informations sur ce sujet.

Pour les mises à jour automatiques, la plupart des bases de données supporte une sorte de mécanisme de déclenchement, ce qui est un code qui est exécuté à des actions spécifiques sur la base de données (par exemple la création d'un nouvel enregistrement ou la modification d'un enregistrement). Vous pouvez publier votre code dans ce déclencheur. Cependant, vous ne devez informer une application RECEVOIR des changements, pas vraiment « faire » les changements de la détente, même si la langue pourrait le rendre possible. Rappelez-vous que l'action qui a déclenché le code est suspendu jusqu'à ce que vous avez terminé avec votre code de déclenchement. Cela signifie qu'un déclencheur maigre est le meilleur, si elle est nécessaire à tous.

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