Le sujet du blocage de SQL Server a été discuté à plusieurs reprises, mais je ne savais pas que même deux insertions simultanées sur une table pouvaient aboutir à une situation de blocage. Lors du test de notre application (SQL Server 2005 en tant que backend, ASP.net 3.5), nous avons inséré des enregistrements dans une table simultanément (vue d'ensemble simplifiée) et cela s'est soldé par un blocage pour plus de 70% des utilisateurs. Je ne pouvais pas m'empêcher de voir comment une insertion est une impasse, car ce n'est pas un cas de ressources multiples. Après une analyse détaillée (de la reproduction du bogue par deux utilisateurs), j'ai trouvé que les deux processus contenaient un verrou RangeS-S sur l'index de clé primaire de la table et essayaient de le convertir en verrou RangeI-N, qui a abouti à blocage et une transaction en cours d'exécution.Blocage de SQL Server lors de l'insertion de lignes dans une table
Question: Peut-on éviter ou réduire ce genre d'interblocages puisqu'il ne s'agit pas d'un cas de changement dans l'ordre d'accès des ressources? Cant 'nous forçons la transaction à obtenir un verrouillage exclusif au départ afin qu'il bloque l'autre processus et évite l'impasse? Quels effets (négatifs) peuvent avoir? Également pourrait-on expliquer plus à propos de RangeI-N lock. Le niveau d'isolement était "sérialisable".
Toute suggestion vous sera utile.
Merci, Gaurav
Avez-vous besoin d'un niveau 'Serializable'? Est-ce que votre transaction fait aussi un SELECT? À quoi ressemble l'instruction SQL? –
Le SQL est un simple proc stocké pour insérer une ligne avec un couple ou construit dans les fonctions sql. Le niveau "Sérialisable" est automatiquement utilisé car nous appelons le proc stocké depuis ADO.NET – Gaurav