2009-10-19 6 views
0

Nous avons plus d'une instance d'un certain exe fonctionnant à partir de différents endroits. Un exe est supposé aller chercher un ensemble d'enregistrements et faire un travail basé sur eux. L'ensemble d'enregistrements récupérés à partir de l'exe A ne doit pas être récupéré par l'exe B et vice versa. Exe A & B sont les mêmes exes; ils courent de différents endroits. Le nombre d'instances peut augmenter ou diminuer. Tous les exes peuvent fonctionner simultanément à la fois. Donc, à venir à ma question ... quelle est la meilleure façon de résoudre ce problème?Stratégies pour émettre des enregistrements uniques via db?

J'ai envisagé d'utiliser des transactions, mais la table qui sert de source à l'exe est également utilisée par d'autres (tâches planifiées, sites Web, etc.). Les tâches planifiées insèrent des données dans la table source.

Cependant, si j'ai dû utiliser des transactions, je peux commencer une transaction avec BEGIN TRAN et ensuite sélectionner les données de la table source en utilisant l'indice WITH (TABLOCKX). Si je devais le faire sur les vues, cela affecterait-il la table/les tables sous-jacentes?

Je veux juste savoir quelles sont les stratégies utilisées pour faire face à cette ...

+1

Cela semble être un excellent candidat pour la mise en file d'attente des messages – RichardOD

+0

@RichardOD: expliquez comment utiliser la mise en file d'attente des messages? Je ne suis pas sûr quand pousser des articles dans une file d'attente de messages, et comment les suivre une fois qu'il est poussé ... – deostroll

Répondre

1

Vous souhaitez éviter les conditions de concurrence entre les processus. Ma réponse ici va dans les détails: SQL Server Process Queue Race Condition

Les transactions ne sont pas beaucoup d'utilisation: c'est la stratégie de verrouillage que vous devez penser, avec l'impact sur la concurrence.

1

Une option pourrait être d'exécuter une requête UPDATE que « marques » les éléments du exe va chercher (avec un ou clause le contraignant à ne marquer que les éléments qui ne sont pas déjà marqués). Ensuite, faites un second SELECT qui extrait les éléments marqués. Ainsi, vous pouvez exécuter la requête SELECT sans vous soucier du délai entre la mise à jour et elle. Tant que les UPDATE sont exécutées de manière atomique (via une transaction qui pourrait être rapidement fermée), vous ne devriez pas avoir de problèmes de concurrence.

+0

+1, pour résumer Dav: "créer un champ de drapeau que le travailleur marquera quand il traite la rangée. tous les travailleurs interrogeront les lignes qui n'ont pas cet indicateur pour s'assurer qu'aucune ligne ne peut être utilisée par plus d'un opérateur. " –

+1

Oui. Le moyen le plus simple de le faire est de faire en sorte que le drapeau identifie réellement quel travailleur l'a signalé (par exemple, via un champ int qui commence à 0 et qui est ensuite défini sur un numéro d'identification de travailleur); De cette façon, vous pouvez toujours retirer les éléments marqués pour votre propre usage. – Amber

Questions connexes