2011-04-20 3 views
0

Je suis coincé dans une décision de verrouillage et je pense que vous pourriez utiliser votre expertise.linq to sql et lock

Je souhaite ajouter une nouvelle ligne à la table et plusieurs threads tentent d'insérer cette nouvelle ligne dans la table. Je veux seulement l'un d'entre eux à scuceed. Pendant que l'insertion est en cours, il peut y avoir des demandes d'autres threads pour lire certaines données de la table et elles devraient réussir. Quelle serait la meilleure approche de verrouillage pour ce scénario? Les verrous de table exclusifs ne fonctionneront pas car je souhaite que les requêtes en lecture aboutissent.

Merci xoxo

Répondre

0

Laissez le DB faire l'index unique de la MAIN-clé donc premières victoires inséreuses. Il n'y a aucun moyen infaillible de le détecter avant SubmitChanges qui ne vous causera pas plus de problèmes que vous ne commencez.

+0

cela ne fonctionnera pas pour ma situation. Alors s'il vous plaît permettez-moi de le reformuler: je veux tenir une serrure pendant un intervalle de temps pendant lequel aucun insertions ne peuvent être faites, mais des sélections peuvent être faites. Quel serait le meilleur moyen pour ça :) – user682732

0

Si vous souhaitez sérialiser des insertions sur une clé particulière sans perturber les lectures, et que vous contrôlez tous les le code qui le ferait, jetez un oeil à sp_getapplock. Faites correspondre le nom de l'applock à la clé pour laquelle vous essayez de bloquer les insertions, puis demandez au code d'insertion simultané de faire un appel de 0 timeout à sp_getapplock. Celui qui réussit doit vérifier à nouveau pour s'assurer que l'enregistrement n'existe pas tout en maintenant le verrou, faire l'insertion, puis relâchez le verrou. Ce n'est pas joli, ce n'est pas rapide, mais ça fait ce que vous voulez. Vous pouvez également connecter sp_getapplock et les SP associés sur votre DataContext pour pouvoir les appeler via L2S au lieu d'envoyer une commande.