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

Ottieni il blocco della tabella di aggiornamento all'inizio della stored procedure in SQL Server

Hai detto:

Hai semplicemente bisogno di un blocco di lettura condiviso per la durata del TXN. Ciò significa che nessun altro processo può ottenere un blocco di "scrittura", insieme a un TABLOCK. E non hai nemmeno bisogno di COUNT.

...
   BEGIN TRANSANCTION
     SELECT TOP 1 KeyCol FROM TheTable WITH (TABLOCK, HOLDLOCK)
...

Perché pensi di volere un UPDATE LOCK?

HOLDLOCK o SERIALIZABLE

Modifica, dopo il commento:

  • "blocco esclusivo" significa "un solo processo che utilizza i dati".
  • "SERIALIZABLE" significa fondamentalmente mantenere le serrature (condivise, esclusive, qualunque cosa) per molto più tempo.

Non puoi specificare "blocco esclusivo" e consentire la lettura ad altri processi. I concetti si escludono a vicenda. Vuoi impedire le scritture sull'intera tabella, che persistono il blocco condiviso/di lettura andrà bene. È qui che entra in gioco SERIALIZABLE.

Da "Modalità di blocco"

Quindi:un blocco condiviso non consente le scritture e può essere fatto persistere rendendolo SERIALIZZABILE