Se il client impiega molto tempo a ricevere i dati e, a sua volta, invia il riconoscimento a SQL Server di aver ricevuto i dati che SQL Server deve attendere, a causa di questa attesa SQL Server non rilascerà i blocchi conservati dalla query a meno che non venga ricevuto il riconoscimento dal client.
Questo non è accurato, dipende dal livello di isolamento.
Ai READ COMMITTED
blocchi predefiniti non vengono mantenuti per la durata dell'esecuzione delle istruzioni. READ COMMITTED
non fornisce coerenza di lettura a livello di istruzione, l'unica garanzia è che non è possibile leggere dati non confermati. Un blocco condiviso viene acquisito e trattenuto per leggere la riga e quindi rilasciato.
A meno che non si disponga di tipi LOB.
I tipi di LOB, essendo potenzialmente molto grandi, non possono essere bufferizzati. Un blocco condiviso deve essere acquisito e trattenuto fino al completamento dell'istruzione, in sostanza dandoti un REPEATABLE READ
comportamento in READ COMMITTED
.
Se sto effettuando una singola chiamata a un database MSSQL su una rete ad alta latenza, si verificheranno blocchi della tabella dovuti a tale latenza?
La latenza non sta causando il blocco della tabella, no. Tuttavia, se è stato acquisito un blocco tabella, la latenza lo prolungherà.
Per citare qualcuno che conosce la meccanica di questo meglio di me ( @RemusRusanu ):
I risultati vengono restituiti al programma client man mano che procede l'esecuzione. Quando le righe "riempiono" l'albero delle esecuzioni, all'operatore principale viene solitamente assegnato il compito di scrivere queste righe nei buffer di rete e di inviarle al client. Il risultato non viene creato prima in un archivio intermedio (memoria o disco) e quindi rispedito al client, ma viene rispedito mentre viene creato (durante l'esecuzione della query). L'invio del risultato al client è ovviamente soggetto al protocollo di controllo del flusso di rete. Se il client non sta attivamente consumando il risultato (ad es. Chiamando SqlDataReader.Read ()), alla fine il controllo di flusso dovrà bloccare il lato di invio (la query che viene eseguita) e questo a sua volta sospenderà l'esecuzione del query.[fonte]
Laddove i risultati non vengono consumati con la stessa rapidità con cui SQL Server è in grado di fornirli, a causa del client o della rete, vediamo ASYNC_NETWORK_IO
accumularsi le attese. Per ribadire, ciò non influenzerà i blocchi acquisiti, ma solo la durata in cui vengono mantenuti.
nolock
suggerimento, ci sarà sempre un lucchetto . La latenza determina solo per quanto tempo verrà trattenuto il blocco.