sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man uteslutande låser en rad som förhindrar CRUD-drift

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

Det kommer att göra susen.

REDIGERA

Som noterat av andra kan du inte låsa en rad så att den inte kan läsas . Det enda sättet jag känner till att göra detta är följande:

WITH (UPDLOCK, TABLOCK)

Och detta förutsätter att en WITH (NOLOCK) aldrig används i en SELECT-sats (vilket bör undvikas ändå).

Jag testade detta och det kommer att fungera, även om TABLOCK endast ska användas i extrema fall. Visst om samtidighet krävs är det en dålig lösning och någon annan form av låsning skulle behövas. Ett sätt är att uppdatera en bitkolumn "Tillgänglig True/False" och bara läsa rader där Tillgänglig =True. Som @gbn föreslog, READPAST kunde användas med detta.



  1. SQL_NO_CACHE för Postgresql?

  2. Ändra unik nyckel tillsammans i mysql

  3. SQL:hur väljer man raden med de mest kända värdena?

  4. Databasradlås under flera transaktioner