LINQ to SQL et des Problèmes de concurrence
Nous sommes en train de construire un Volume Élevé de Commandes Système d'Enregistrement.
Il y a trois tables principales:
1. Les commandes
2. OrderDetails
3. OrderShipment
La table d'Expédition contient n enregistrement par commande et un enregistrement à l'entrée d'envoi peut être modifié avant que le Client accepte ième ordre, après quoi il est gelé. (Une exigence de l'entreprise)
Bien que cela ne peut pas arriver dans des scénarios du monde réel...
lors de nos tests de charge, nous obtenons le Système.Les données.Linq.ChangeConflictException exceptions.
L'emballage jusqu'à le présenter à l'intérieur d'un transacion ne l'aide pas non plus.
Ne pouvons-nous pas la force de LINQ pour obtenir un verrou sur la ligne pour toute la durée de l'opération de mise à jour?
Est-il un autre moyen de s'en sortir?
OriginalL'auteur SharePoint Newbie | 2008-10-10
Vous devez vous connecter pour publier un commentaire.
Si vous rencontrez des problèmes réels avec les mises à jour simultanées sur les mêmes données, alors vous pourriez envisager d'effectuer l'ensemble de l'opération dans une transaction - c'est à dire l'obtention de données et la commettre. Tant que vous traitez les obtenir/mettre à jour/validation en tant que de courte durée, opération atomique (c'est à dire que vous n'avez pas de pause pour l'utilisateur d'entrée dans le milieu), il devrait être OK.
En particulier, avec un niveau d'isolation serializable, personne ne peut mettre à jour les données que vous avez un verrou en lecture sur (c'est à dire tout ce que vous avez demandé). Le seul problème est que cela peut conduire à des scénarios de blocage si différentes requêtes de lecture de données dans un ordre différent. Autant que je sache, il n'y a aucun moyen d'obtenir de LINQ-to-SQL à la question (UPDLOCK) de l'indice, qui est une honte.
Un TransactionScope ou un SqlTransaction, aussi longtemps qu'ils sont ensemble comme d'isolation serializable (qui est la valeur par défaut pour TransactionScope).
Je me demande si c'est un lock-escalade de blocage, ou un ordre différent de l'impasse? Dans le premier cas, une option (même si l'on perd beaucoup de LINQ avantages) pourrait être d'interroger les données avec un SP - ensuite, vous pouvez inclure la directive UPDLOCK, empêcher l'escalade du verrouillage des questions.
(toujours via LINQ, je veux dire - c'est à dire indiquer le concepteur de cette SP retourne ce tableau)
Si vous souhaitez mettre un verrou de mise à jour à l'intérieur d'une transaction, vous pouvez toujours utiliser ExecuteQuery à faire et puis pour le reste du travail à l'aide de la L2S objets. Exemple: forums.microsoft.com/msdn/...
(Bien que le scénario décrit sons comme celui où je voudrais éviter d'utiliser db serrures pour gérer la simultanéité et au lieu de construire un "verrouillage" mécanisme à l'application de la logique elle-même...)
OriginalL'auteur Marc Gravell
vous voudrez peut-être chercher dans Entity Framework qui exécute tout comme une transaction. Voici deux podcasts qui peut aussi être intéressant à propos de l'Entity Framework.
DNRTV - partie 1 -
partie 2
OriginalL'auteur Alexandre Brisebois
Pour ce genre de situations, c'est à dire plus d'un utilisateur peut vouloir faire des changements pour le même enregistrement/client/commande/de ce qu'il est préférable de construire le "verrouillage" dans la logique de l'application, plutôt que d'utiliser la base de données de serrures.
À l'aide de DB serrures à résoudre logique de verrouillage de données va vous présenter avec un tas de nouvelles questions. Une meilleure solution est d'avoir des colonnes et/ou des tables où vous pouvez indiquer qu'une commande/client/etc est en cours d'édition [par un utilisateur], jusqu'à ce que lorsqu'il est verrouillé etc. Requête de la table (ou des colonnes) pour vérifier si le client/commande/chose est disponible pour l'édition avant d'autoriser un autre utilisateur à modifier.
Voir:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3984968&SiteID=1
Je souhaite que je pourrais. Malheureusement, Microsoft a mis à jour les forums MSDN, et dans le processus, ils ont tué tous les liens à des postes/fils, dont l'un au-dessus. Le thread encore exister quelque part, mais je ne me souviens pas de qui il s'agissait...
OriginalL'auteur KristoferA