Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

È possibile forzare il blocco a livello di riga in SQL Server?

Puoi utilizzare l'hint ROWLOCK, ma AFAIK SQL potrebbe decidere di aumentarlo se le risorse scarseggiano

Dal documento:

ROWLOCK Specifica che i blocchi di riga vengono acquisiti quando vengono normalmente eseguiti i blocchi di pagina o tabella. Quando le transazioni specificate operano a livello di isolamento SNAPSHOT, i blocchi di riga non vengono presi a meno che ROWLOCK non sia combinato con altri suggerimenti di tabella che richiedono blocchi, come UPDLOCK e HOLDLOCK.

e

Suggerimenti di blocco ROWLOCK, UPDLOCK e XLOCK che acquisiscono blocchi a livello di riga possono posizionare blocchi sulle chiavi di indice anziché sulle righe di dati effettive. Ad esempio, se atable ha un indice non cluster e un'istruzione SELECT che utilizza un suggerimento di blocco viene gestita da un indice di copertura, viene acquisito un blocco sulla chiave dell'indice nell'indice di copertura anziché sulla riga di dati nella tabella di base.

Infine, questo fornisce una spiegazione piuttosto approfondita sull'escalation dei blocchi in SQL Server 2005, che è stata modificata in SQL Server 2008.

C'è anche, molto in profondità:Locking in The Database Engine (nei libri online)

Quindi, in generale

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

Dovrebbe essere ok, ma a seconda degli indici e del carico sul server potrebbe finire per degenerare in un blocco della pagina.