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

Sådan låser du udelukkende en række, der forhindrer CRUD-drift

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

Det vil gøre det trick.

REDIGER

Som bemærket af andre, kan du ikke låse en række for ikke at blive læst . Den eneste måde, jeg kender til at gøre dette på, er som følger:

WITH (UPDLOCK, TABLOCK)

Og dette forudsætter, at en WITH (NOLOCK) aldrig bruges i en SELECT-sætning (som alligevel bør undgås).

Jeg testede dette, og det vil virke, selvom TABLOCK kun bør bruges i ekstreme tilfælde. Hvis der kræves samtidighed, er det bestemt en dårlig løsning, og en anden form for låsning ville være nødvendig. En måde er at opdatere en bit-kolonne "Tilgængelig True/False" og kun læse rækker, hvor Available =True. Som @gbn foreslog, kunne READPAST bruges med dette.



  1. Hvordan sikkerhedskopierer og gendanner man en database som en kopi på den samme server?

  2. SQL max() returnerer kun 1 række, hvis kolonnen har flere max-værdier

  3. Viser SQL ikke null-værdier på en ikke-lig-forespørgsel?

  4. Kan en oracle SQL-forespørgsel udføre en strengforespørgsel valgt fra en tabel?