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

ORDINA PER e CON (ROWLOCK, UPDLOCK, READPAST)

Come previsto

  • Il SELECT con ORDER BY, senza ROWLOCK, senza indice avrà un blocco della tabella a causa di un ordinamento di scansione/intermedio per elaborare il TOP 2. Quindi la 2a sessione salta l'intera tabella a causa di READPAST

  • Il SELECT senza ORDER BY sta semplicemente selezionando 2 righe qualsiasi, che sono in ordine di inserimento (pura coincidenza, non c'è un ordine implicito). Il fatto che queste 2 righe siano bloccate fa sì che la seconda sessione salti alle righe successive non bloccate.

SQL Server tenta di mantenere i blocchi il più granulari possibile, ma la scansione indica un blocco della tabella. Ora, questo normalmente non farebbe differenza (sarebbe un blocco di lettura condiviso) ma hai anche UPDLOCK che significa una tabella bloccata esclusivamente

Quindi, hai bisogno di entrambi

  • 3 suggerimenti nelle query SELECT (ROWLOCK, UPDLOCK, READPAST) per controllare la granularità, l'isolamento e la concorrenza.
    L'utilizzo del solo ROWLOCK causerà comunque un blocco esclusivo su ogni riga da scansionare/ordinare.
  • un indice su Value INCLUDE TestID per rendere SELECT efficiente. Un solo indice probabilmente risolverà la concorrenza ma non sarà garantita.

In una delle tue domande precedenti ho collegato la mia risposta (in un commento) a Condizione di competizione della coda di processo di SQL Server dove ho tutti e 3 i suggerimenti per il blocco