locking d'isolation de transaction sérialisable

J'ai placé un verrou d'isolation de transaction sérialisable pour une transaction. Mais j'observe quelques résultats qui ne sont pas prévus.

Ma requête est

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20 

Ici col1 est la key primaire. Ici les lignes avec col1 ayant la valeur 10,11,12 …. 19,20 sont verrouillées pour la mise à jour / insertion. Dans l'état où j'ai donné des conditions comme col1> 10 et col1 <20 mais toujours les rangées ayant col1 = 10 et col1 = 20 se verrouillent.

Si je donne

 update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20 

alors les lignes avec col2 ayant des valeurs de 9 à 21 sont verrouillées. Alors pourquoi col1 ayant 9 et 21 est verrouillé ici?

Pour la requête ci-dessous, la table complète est verrouillée.Voici col3 est une colonne non-primaire. Ne puis-je pas verrouiller si la colonne dans laquelle la condition n'est pas une key primaire?

 update tabl1 set col2 = 10 where col3 > 10 and col3 < 20 

    Pour le locking de la plage de keys, SQL Server doit utiliser un index pour satisfaire la condition de plage. En ce qui concerne votre dernière requête, vous avez besoin d'un index sur col3 (et éventuellement de conseils pour forcer son utilisation si le plan ne l'utilise pas)

    En outre, il ne se contente pas de verrouiller la plage spécifique dans votre clause WHERE . Il verrouille les keys. Un verrou de plage sur une touche protège la plage de cette touche vers le bas jusqu'à la key suivante, de sorte que la plage exacte qui sera bloquée dépend des keys qui existent dans l'index.

    Plus de détails / liens sont dans ma réponse ici