Si el cliente tarda mucho tiempo en recibir datos y, a su vez, envía un acuse de recibo a SQL Server de que ha recibido los datos que SQL Server tiene que esperar, debido a esta espera, SQL Server no liberará los bloqueos retenidos por la consulta a menos que se reciba un acuse de recibo del cliente.
Esto no es exacto, depende del nivel de aislamiento.
Por defecto, los READ COMMITTED
bloqueos no se mantienen durante la ejecución de las declaraciones. READ COMMITTED
no proporciona consistencia de lectura a nivel de declaración, la única garantía es que no puede leer datos no confirmados. Se adquiere un bloqueo compartido y se mantiene para leer la fila y luego se libera.
A menos que tenga tipos de LOB.
Los tipos de LOB, que son potencialmente muy grandes, no pueden almacenarse en el búfer. Un bloqueo compartido debe ser adquirido y retenido hasta que se complete la declaración, esencialmente dándole REPEATABLE READ
comportamiento en READ COMMITTED
.
Si estoy haciendo una sola llamada a una base de datos MSSQL a través de una red de alta latencia, ¿se producirán bloqueos de tabla debido a esa latencia?
La latencia no está causando el bloqueo de la mesa, no. Sin embargo, si se ha adquirido un bloqueo de mesa, la latencia lo prolongará.
Para citar a alguien que conoce la mecánica de esto mejor que yo ( @RemusRusanu ):
Los resultados se devuelven al programa cliente a medida que avanza la ejecución. A medida que las filas "burbujean" en el árbol de ejecución, el operador superior generalmente tiene la tarea de escribir estas filas en las memorias intermedias de la red y enviarlas de regreso al cliente. El resultado no se crea primero en algún almacenamiento intermedio (memoria o disco) y luego se devuelve al cliente, sino que se devuelve a medida que se crea (a medida que se ejecuta la consulta). Enviar el resultado al cliente está, por supuesto, sujeto al protocolo de control de flujo de red. Si el cliente no está consumiendo activamente el resultado (por ejemplo, llamando a SqlDataReader.Read ()), entonces el control de flujo tendrá que bloquear el lado emisor (la consulta que se está ejecutando) y esto a su vez suspenderá la ejecución del consulta.[fuente]
Cuando los resultados no se consumen tan rápido como SQL Server puede entregarlos, ya sea debido al cliente o la red, vemos que se ASYNC_NETWORK_IO
acumulan las esperas. Para reiterar, esto no influirá en los bloqueos que se adquieren, solo en la duración de su retención.
nolock
pista, siempre habrá un bloqueo . La latencia solo determina cuánto tiempo se mantendrá el bloqueo.