J'ai une table qui contient les temps de connexion et de déconnexion des clients.Comment éviter les blocages sur des instructions de mise à jour simples?
ID int
ClientID int
BeginDate datetime
EndDate datetime
Lorsqu'un client est connecté, un Session
enregistrement est créé avec sa EndDate
est nulle.
INSERT Session(ClientID, BeginDate, EndDate)
VALUES(@ClientID, GETDATE(), null)
Lorsque le client est déconnecté, mettre à jour la session il est donc EndDate
contient le temps de déconnexion.
UPDATE Session
SET EndDate = GETDATE()
WHERE Id = @SessionID
Mais cela n'est pas toujours appelé. Donc, pour m'assurer que le même client n'a pas plus d'une session en même temps, j'exécute cette requête avant d'insérer 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 temps, selon le deadlock graph.
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 de mal?
+1, je sélectionne simplement l'ID 'with (nolock)' maintenant et ne met à jour la table que si nécessaire. Ca a marché comme un charme, merci. –