2010-06-17 8 views
1

Scénario: Je souhaite autoriser plusieurs applications serveur (2 à 20, probablement) à utiliser une base de données unique à l'aide d'ADO.NET. Je souhaite que les applications individuelles puissent s'approprier des ensembles d'enregistrements dans la base de données, les conserver en mémoire (pour la vitesse) dans DataSets, répondre aux demandes des clients sur les données, effectuer des mises à jour et empêcher d'autres applications de les mettre à jour. a été abandonné.Utilisation de transactions avec des adaptateurs de données ADO.NET

Je suis nouveau sur ADO.NET, mais il semble que cela devrait être possible en utilisant des transactions avec Data Adapters (couche déconnectée ADO.NET).

Question part 1: Est-ce la bonne façon d'essayer?

Question part 2: Si c'est la bonne façon, quelqu'un peut-il me diriger vers des didacticiels ou des exemples de ce type d'approche (en C#)?

Question partie 3: Si je veux être en mesure de prendre en charge des dossiers et de les libérer de manière indépendante, suis-je besoin d'une opération distincte pour chaque enregistrement, et par extension un DataAdapter séparé et DataSet de tenir chaque record, ou y a-t-il une meilleure façon de le faire? Chaque application possèdera probablement la propriété de milliers d'enregistrements simultanément.

Répondre

1
  • Pendant combien de temps envisagiez-vous de garder la transaction ouverte?
  • Combien d'utilisateurs simultanés allez-vous prendre en charge?

Voici deux des questions que vous devez vous poser. Si la réponse pour le premier est "longue" et la réponse à la seconde est "beaucoup", alors l'approche se heurtera probablement à des problèmes. Donc, ma réponse à la question 1 est: non, ce n'est probablement pas la bonne approche. Si vous adoptez l'approche du verrou transactionnel, vous allez limiter votre évolutivité et vos temps de réponse. Vous pourriez également rencontrer des erreurs de base de données. par exemple. SQL Server (en supposant que vous utilisez SQL Server) peut être très gourmand avec des verrous et peut verrouiller plus de ressources que vous n'en exigez/attendez. L'application peut demander des verrous de niveau ligne pour verrouiller les enregistrements qu'elle "possède", mais SQL Server peut escalader ces verrous de ligne vers un verrou de table. Cela bloquerait et pourrait entraîner des délais d'attente ou peut-être des blocages.

Je pense que la meilleure façon de répondre aux exigences que vous leur avez indiquées est d'écrire un système de gestion de verrouillage/d'enregistrement. Martin Fowler appelle cela un Pessimistic Offline Lock.

MISE À JOUR

Si vous utilisez SQL Server 2008, vous pouvez définir le comportement d'escalade de verrouillage au niveau de la table:

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

Cela désactive l'escalade de verrous dans des situations "la plupart" et peut vous aider.

+0

Oui Je pensais garder les transactions ouvertes pendant longtemps. Toutes les applications accédant à la base de données sont côté serveur. Il n'y aurait qu'un petit nombre de ces applications, desservant des milliers de clients. La propriété des enregistrements ne migrerait que rarement entre les applications du serveur. Ce ne serait que lors de cas d'erreur où plus d'une application serveur tenterait d'accéder simultanément aux mêmes enregistrements. En raison de ces conditions, j'avais espéré pouvoir utiliser des transactions pour obtenir une simultanéité pessimiste. Votre avertissement sur le verrouillage gourmand de SQL Server semble cependant être un problème majeur. – Ergwun

+0

@Ergwun: utilisez-vous SQL Server 2008? –

+0

Oui, pour le moment, mais j'espère garder mes applications indépendantes du fournisseur de données. Merci. – Ergwun

0

Vous avez réellement besoin du contrôle des accès concurrents, ainsi que de la prise en charge des transactions.N'entrent en ligne que lorsque vous effectuez plusieurs opérations dans la base de données. Dès que la connexion est libérée, la transaction n'est plus applicable.

concurrency vous permet de travailler avec plusieurs mises à jour sur les mêmes données. Si deux ou plusieurs clients contiennent le même ensemble de données et que vous devez lire/écrire les données après qu'un autre client l'ait mis à jour, la concurrence vous permettra de décider quel ensemble de mises à jour conserver et lequel ignorer. Mentionner le concept de concurrence est au-delà de la portée de cet article. Commander article this pour plus d'informations.

+0

J'espérais utiliser de longues transactions pour obtenir une concurrence pessimiste. Puisque les applications sont toutes des applications serveur, j'espérais que ce serait une solution viable. – Ergwun

+0

Jetez un oeil à TransactionScope dans ce cas. –

Questions connexes