E 'possibile forzare il blocco a livello di riga in SQL Server?
-
29-09-2019 - |
Domanda
posso vedere come disattivare a livello di riga e di livello di pagina di blocco in SQL Server, ma non riesco a trovare un modo per forzare SQL Server per il blocco a livello di riga uso. C'è un modo per forzare SQL Server per il blocco a livello di riga e l'uso non utilizzare il blocco a livello di pagina?
Soluzione
È possibile utilizzare il suggerimento ROWLOCK, ma per quanto ne so SQL può decidere di degenerare, se si corre a corto di risorse
Dal doco :
scalmo Specifica che i blocchi di riga sono presa quando pagina o tabella serrature sono normalmente adottate. Quando specificato in transazioni che operano a ISTANTANEA livello di isolamento, blocchi di riga non sono adottata a meno che si combina con ROWLOCK altri indizi di tabella che richiedono serrature, come ad esempio UPDLOCK e HOLDLOCK.
e
Blocco accenna ROWLOCK, UPDLOCK, E XLOCK che i blocchi acquisire a livello di riga possono immettere serrature su chiavi di indice piuttosto che il righe di dati effettivi. Ad esempio, se un tabella include un indice non cluster, e SELECT utilizzando un hint di blocco è gestito da un indice di copertura, un blocco è acquisita sulla chiave indice nella indice di copertura piuttosto che sui dati riga nella tabella di base.
E infine questo dà una bella approfondita spiegazione circa l'escalation dei blocchi in SQL Server 2005 che è stato cambiato in SQL Server 2008.
C'è anche, molto in profondità: Blocco nel database del motore (nella documentazione in linea)
Quindi, in generale
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
dovrebbe essere ok, ma a seconda delle indici e il carico sul server, può finire per l'escalation a un blocco di pagina.
Altri suggerimenti
L'uso della clausola di ALLOW_PAGE_LOCKS ALTER / CREATE INDEX :
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Non puoi realmente forzare l'ottimizzatore di fare qualsiasi cosa, ma è possibile guidarla.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93