2010-10-15 1 views
1

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

+0

Avez-vous besoin d'un niveau 'Serializable'? Est-ce que votre transaction fait aussi un SELECT? À quoi ressemble l'instruction SQL? –

+0

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

Répondre

3

Changez votre niveau d'isolation ADO. Sauf si vous avez des exigences claires pour Serializable, vous ne devriez pas l'utiliser. Si vous l'utilisez, vous devez en comprendre clairement les conséquences, et les blocages fréquents dus aux verrous de portée sont l'une de ces conséquences.

Le niveau d'isolement de System.Transactions est contrôlé par la propriété IsolationLevel.

+0

Je suppose que changer IsloationLevel sera utile si je faisais aussi quelques lectures, je ne pense pas que cela aidera dans les inserts, cependant, je le ferai essayez ceci et postez les résultats. – Gaurav

+0

Si vous ne faites pas de lectures, d'où viennent les verrous de la gamme? –

1

Utilisez sp_getapplock pour acquérir un verrou exclusif personnalisé

+0

J'essayais aussi d'obtenir un verrou exclusif de sorte qu'il bloque juste l'autre insertion et ne finisse pas dans l'impasse. Je vais essayer cela et afficher les résultats. – Gaurav

Questions connexes