Si le client met longtemps à recevoir des données et à son tour envoyer un accusé de réception à SQL Server qu'il a reçu les données que SQL Server doit attendre, en raison de cette attente, SQL Server ne libérera pas les verrous détenus par la requête à moins que l'accusé de réception ne soit reçu du client.
Ce n'est pas précis, cela dépend du niveau d'isolement.
Par défaut, les READ COMMITTED
verrous ne sont pas maintenus pendant la durée de l'exécution des instructions. READ COMMITTED
ne fournit pas de cohérence de lecture au niveau de l'instruction, la seule garantie est que vous ne pouvez pas lire les données non validées. Un verrou partagé est acquis et maintenu pour lire la ligne, puis libéré.
Sauf si vous avez des types de LOB.
Les types de LOB, étant potentiellement très volumineux, ne peuvent pas être mis en mémoire tampon. Un verrou partagé doit être acquis et maintenu jusqu'à la fin de l'instruction, ce qui vous donne essentiellement un REPEATABLE READ
comportement à READ COMMITTED
.
Si j'effectue un seul appel vers une base de données MSSQL sur un réseau à latence élevée, des verrous de table se produiront-ils en raison de cette latence?
La latence ne provoque pas le verrouillage de la table, non. Cependant, si un verrou de table a été acquis, la latence va le prolonger.
Pour citer quelqu'un qui connaît mieux la mécanique que moi ( @RemusRusanu ):
Les résultats sont renvoyés au programme client au fur et à mesure de l'exécution. Lorsque les lignes «bouillonnent» dans l'arbre d'exécution, l'opérateur supérieur est généralement chargé d'écrire ces lignes dans des tampons réseau et de les renvoyer au client. Le résultat n'est pas créé d'abord dans un stockage intermédiaire (mémoire ou disque), puis renvoyé au client, il est renvoyé à la création (lors de l'exécution de la requête). Le renvoi du résultat au client est, bien entendu, soumis au protocole de contrôle de flux réseau. Si le client ne consomme pas activement le résultat (par exemple en appelant SqlDataReader.Read ()), le contrôle de flux devra finalement bloquer le côté d'envoi (la requête en cours d'exécution), ce qui suspendra à son tour l'exécution de la commande requete.[la source]
Lorsque les résultats ne sont pas consommés aussi rapidement que SQL Server peut les fournir, que ce soit à cause du client ou du réseau, nous voyons des ASYNC_NETWORK_IO
attentes s'accumuler. Pour le répéter, cela n'influencera pas les verrous acquis, mais uniquement la durée de leur maintien.
nolock
indice, il y aura toujours un verrou . La latence détermine simplement la durée du verrouillage.