2012-09-14 3 views
1

J'ai un serveur C# WCF multithread avec des ressources stockées dans la base de données. J'accède à db avec EF.Serveur WCF multithread avec Entity Framework: transactions et synchronisation, condition de concurrence

Le serveur traite les demandes provenant de nombreux travailleurs. Les travailleurs sont connectés en groupes. Chaque groupe a ses propres ressources dans la base de données. Certains groupes partagent des ressources avec un autre groupe.

Toutes les requêtes concernent des ressources: synchronisation, création, mise à jour, suppression. Si les travailleurs A et B sont avec le même groupe, l'opérateur A demande une mise à jour, puis B demande la synchronisation, et la demande de B commence et se termine avant que la demande de A se termine, alors l'opérateur B n'obtiendrait jamais la mise à jour de A

Existe-t-il un moyen avec une structure d'entité de faire des opérations atomiques comme get_and_increase_if? Je voudrais implémenter un outil de type sémaphore sur la valeur de base de données.

Existe-t-il un autre moyen de résoudre ce problème?

La synchronisation est effectuée par un compteur de révisions. Le groupe a une révision. Création/mise à jour se fait par:

  1. Increase group revision()
  2. Set new/updated object revision to new group revision()

Edit: Il existe plusieurs types de ressources, chacun dans sa propre table db. Je ne peux donc pas simplement définir la valeur suivante comme révision pour la ressource.

+1

Peut-être que c'est moi, mais je trouve cette question très vague. De quels groupes parlez-vous? Quelle est cette requête de synchronisation dont vous parlez? Pourquoi vos différentes demandes devraient-elles interagir? Pourquoi ne pouvez-vous pas résoudre cela avec des transactions de base de données? – Steven

+0

@Steven Worker demande la synchronisation, il a sa propre révision. Le serveur vérifie simplement s'il y a quelque chose de nouveau pour la révision du travailleur ('if worker.revision Ari

Répondre

1

Si elle est un compteur prochain numéro de révision que vous avez besoin, vous pouvez utiliser des séquences, voir: http://msdn.microsoft.com/en-us/library/ff878091.aspx

S'il est plus compliqué, vous pouvez utiliser les transactions sérialisables.

+0

Ce n'est pas si simple. J'ai beaucoup de ressources différentes dans beaucoup de tables différentes. Ajouté à la question. – Ari

+0

Ensuite, la voie à suivre est d'utiliser une portée de transaction avec le niveau d'isolement mis à sérialisable –

+0

Je pensais à ce sujet, mais je ne trouve pas un moyen de 1) obtenir la valeur de DB, 2) l'augmenter et les propriétés des autres objets. – Ari

1

Si vous utilisez SqlServer 2005 ou au-dessus:

UPDATE GroupRevisions SET Revision = Revision+1 
OUTPUT INSERTED.Revision 
WHERE GroupRevisionID = @Id 
+0

J'ai besoin d'un framework d'entité C#, pas de sql. – Ari

+0

Pourquoi? Entity Framework dispose d'installations pour appeler sql directement.Plus précisément, vous faites quelque chose de complexe et certainement pas construit dans Entity Framework; c'est * exactement pourquoi * ces installations sont là. – JeffreyABecker

+0

Peut-être, mais je serais très difficile pour moi maintenant de le faire de cette façon. – Ari

Questions connexes