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

Come eseguire un blocco di riga?

Partendo dal presupposto che questo sia il server MS SQL, probabilmente vuoi UPDLOCK , eventualmente abbinato a ROWLOCK (Suggerimenti per la tabella ). Ho difficoltà a trovare un articolo decente che descriva la teoria, ma ecco un rapido esempio:

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 

Questa istruzione inserirà un blocco dell'aggiornamento sulla riga per la durata della transazione (quindi è importante essere consapevoli di quando la transazione terminerà). Poiché i blocchi di aggiornamento sono incompatibili con i blocchi esclusivi (necessario per aggiornare i record), questo impedirà a chiunque di aggiornare questo record fino al termine della transazione.

Si noti che altri processi che tentano di modificare questo record verranno bloccati fino al completamento della transazione, tuttavia continueranno con qualsiasi operazione di scrittura richiesta una volta terminata la transazione (a meno che non siano scaduti o interrotti come processo deadlock). Se desideri impedirlo, gli altri processi devono utilizzare suggerimenti aggiuntivi per interrompere se viene rilevato un blocco incompatibile o saltare il record se è cambiato.

Inoltre, Non dovresti utilizzare questo metodo per bloccare i record in attesa dell'input dell'utente . Se questa è la tua intenzione, dovresti invece aggiungere una sorta di colonna "in fase di modifica" alla tua tabella.

I meccanismi di blocco del server SQL sono adatti solo per l'uso per preservare l'integrità dei dati/prevenzione dei deadlock:le transazioni dovrebbero generalmente essere mantenute il più brevi possibile e non dovrebbe certamente essere mantenuto in attesa dell'input dell'utente.