2010-02-04 5 views
5

J'ai une application C# avec NHibernate qui doit effectuer certaines opérations sur une base de données SQL Server.Mécanisme de verrouillage entre processus sur plusieurs machines

Notre objectif est d'exécuter cette application plusieurs fois dans la même machine et également dans d'autres machines. En fait, l'application insère une ligne dans une table SQL et vérifie si la première ligne avec la date minimum est la ligne avec le PID correct et le nom de la machine, donc l'application définit le verrou et fait le travail.

Nous avons des problèmes avec cette logique, car l'application doit également supprimer le verrouillage des autres applications si l'application qui retient le verrou est écrasée.

Une indication sur le changement de l'architecture de la serrure?

Le problème est que l'application peut fonctionner sur plusieurs machines.

Répondre

2

Que diriez-vous de gérer le verrou dans la base de données? Vous pouvez avoir une table/procédure stockée, où chaque instance en cours s'enregistre, obtient un ID unique et utilise la procédure stockée pour verrouiller & gratuitement. (Même technique que la prévention de plusieurs connexions pour un seul utilisateur de plusieurs machines).

+0

Je préfère ne pas utiliser StoredProcedures car dans ma configuration Nhibernate je n'en ai pas. –

+0

Je voulais dire mettre en œuvre ceci en dehors de la portée de données standard, en tant que module séparé tous ensemble. – Amirshk

2

Soit

  • ont un processus (serveur) qui gère les verrous - tous les clients enregistrés et serrures de demande de ce serveur.
  • Pessimistic offline locking

Je l'ai mis en œuvre dans les deux sens. Les verrous hors ligne peuvent fonctionner avec des bases de données, mais il est possible que vous introduisiez des thrash si trop de processus attendent constamment sur le verrou (même si un serveur db correct doit mettre en cache les informations). Assurez-vous également d'utiliser le niveau d'isolation des transactions ReadCommited lorsque vous faites quelque chose avec cette table, et préparez-vous à des blocages

+0

Je vais essayer ... –

Questions connexes