Comment éviter les blocages sur les instructions de mise à jour simples?

J'ai une table qui contient les time de connection et de déconnection des clients.

ID int ClientID int BeginDate datetime EndDate datetime 

Lorsqu'un client est connecté, un logging de Session est créé avec son EndDate est null.

 INSERT Session(ClientID, BeginDate, EndDate) VALUES(@ClientID, GETDATE(), null) 

Lorsque le client est déconnecté, je mets à jour la session afin que EndDate contienne le time de déconnection.

 UPDATE Session SET EndDate = GETDATE() WHERE Id = @SessionID 

Mais cela ne s'appelle pas toujours.

Donc, pour m'assurer que le même client n'a pas plus d'une session en même time, je lance cette requête avant d'insert une nouvelle session.

 UPDATE Session SET EndDate = GETDATE() WHERE ClientID = @ClientID and EndDate is null 

Ce qui provoque un blocage lorsque plusieurs clients se connectent en même time, selon le graphe de blocage .

Je ne comprends pas pourquoi cela provoque un blocage,
Je ne comprends même pas pourquoi cette requête a besoin d'un verrou.
Qu'est-ce que je fais mal?

Mettre à jour EndDate à chaque fois avant d'en insert un ne semble pas être une bonne idée. Vous pouvez verrouiller la table même si aucune mise à jour n'est effectuée. Vous devez vérifier s'il existe une session où endate est null pour un client donné avant la mise à jour. Vous pouvez utiliser l'indicateur NoLock pour lire datatables non validées.

Cette vérification minimisera le locking causé par cette requête. Prévenir vaut mieux que guérir 🙂

bien une instruction de mise à jour fait des X-verrous, pour cette instruction peut-être même un verrou de page ou de table, vous pouvez essayer de sélectionner les ID des sessions ouvertes et d'exécuter une mise à jour pour celles-ci avec une clause plus susceptible de verrouiller uniquement ces lignes. Cela dépend aussi de votre niveau d'isolement.

façon ne peut pas y avoir plus d'une session ouverte, et si (et je devine qu'il s'agit d'une application web) un user ouvre le site avec 2 browsers web différents.