Bonjour à tous,
Je rencontre des problème de deadlock sur ma couche business lors de scénario d'achat (appel à la chaine de méthode venant lire, insérer et updater des données de réservation).
Chaque appel de service vient partiellement remplir des données de réservations.
Certaines méthodes sont englobés dans une TransactionsScope en mode ReadCommited.
Les transactions scope de ne sont pas chainés.
Les ordre SQL sont envoyés via ADO.NET sans utiliser de SqlTransaction, sur une base SQL server 2012
Normalement, chaque ordre Insert/Update/Delete faite sur les tables dans ces services sont restreint par un identifiant de réservation (ce qui fait que deux parcours de réservation parallèle ne peuvent pas venir modifier les mêmes données).
Dans les faits :
Je lance un bout de code qui me lance 50 parcours de réservation complet en parallèle. A noter que dans un parcours de réservation tout est séquentielle, rien n'est lancé en parallèle. Au bout de peu de temps je recoit un deadlock.
Selon les lancement de ce bout de code, le deadlock ne se produit pas toujours (voir rarement) au même endroit
j'ai branché le sql server profiler qui m'indique bien des graphes d'erreurs mais c'est assez compliqué à comprendre
Dans un exemple de deadlock j'ai par exemple :
- une requete select participant au deadlock, un select qui renvoie les x dernières réservations sans filtres particulier (donc potentiellement "bloqué" si un ordre update non commité existe sur l'une de ces réservations)
- une requete select participant au deadlock, un select qui renvoie les x dernières réservations faite par un customer (théoriquement unique par parcours de réservation, donc ne doit pas se croiser avec le reste)
- une requete update "victime" du deadlock, qui mettait a jour un champ dans la table des réservations sur une réservation précise.
j'ai aurai aimé recevoir les paramètres envoyés dans la requête pour bien m'assurer si les données recues ou updatés se croisent mais je n'arrivent pas à trouver ca dans le profiler (j'ai filtré par tout ce qui concerne les locks)
J’aperçois aussi que si j'ai un ordre update sur un row dans une transaction non complete, un select sur la table qui ramènerait le row finit en timeout (si je laisse un point d’arrêt avant le transaction.complete bien sûr). Est-ce normal ? J'ai cru comprendre que oui mais c'était pas hyper clair. A noter que mes transactions ne sont pas hyper longues, de l'ordre de 2 3 secondes max. Car effectivement je peux avoir en parallèle un ordre update sur un row et un autre thread qui fait un select sur ce row. Mais je m'attend dans ce cas a ce que le select reste en wait et dès que la transaction du update est commité ca renvoie la résultat.
Bref je n'ai plus trop d'idées, si vous avez des conseils je suis preneur,
Merci d'avance
Partager