sql >> Databasteknik >  >> RDS >> Sqlserver

Skaffa uppdateringstabelllås vid start av lagrad procedur i SQL Server

Du sa:

Du behöver helt enkelt ett delat läslås under TXN:s varaktighet. Detta betyder att ingen annan process kan få ett "skriv"-lås, i samband med ett TABELBLOCK. Och du behöver inte heller COUNT.

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

Varför tror du att du vill ha ett UPPDATERINGSLÅS?

HOLDLOCK or SERIALIZABLE

Redigera, efter kommentar:

  • "exklusivt lås" betyder "endast en process som använder data".
  • "SERIALISERBAR" betyder i grunden att man håller låsen (delade, exklusiva, vad som helst) mycket längre.

Du kan inte ange "exklusivt lås" och tillåta andra processer att läsa. Begreppen utesluter varandra. Du vill förhindra skrivningar till hela tabellen, vilket bestod delat/läs lås kommer att göra. Det är här SERIALIZABLE kommer in.

Från "Låslägen"

Så:ett delat lås tillåter inte skrivningar och kan fås att bestå genom att göra det SERIALISERBART



  1. PDO-förberedda uttalanden IN-klausul med namngivna platshållare fungerar inte som förväntat

  2. CTE-borttagning inte begått förrän följande uttalanden är klara

  3. Hur förhindrar man att utvalda found_rows går sönder under tävlingsförhållanden?

  4. hämta mysql-kolumnen från kommandoraden