sql >> Database >  >> RDS >> Sqlserver

Hoe uitsluitend een rij te vergrendelen die CRUD-bewerking voorkomt?

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

Dat zal het lukken.

BEWERKEN

Zoals anderen al hebben opgemerkt, kun je een rij niet vergrendelen om niet gelezen te worden . De enige manier die ik ken om dit te doen is als volgt:

WITH (UPDLOCK, TABLOCK)

En dit veronderstelt dat een WITH (NOLOCK) nooit wordt gebruikt in een SELECT-instructie (wat sowieso moet worden vermeden).

Ik heb dit getest en het zal werken, hoewel TABLOCK alleen in extreme gevallen moet worden gebruikt. Zeker als gelijktijdigheid vereist is, is het een slechte oplossing en zou een andere vorm van vergrendeling nodig zijn. Een manier is om een ​​bitkolom "Available True/False" bij te werken en alleen rijen te lezen waar Beschikbaar =True. Zoals @gbn suggereerde, zou READPAST kon hiermee worden gebruikt.



  1. sql-query's om de overeenkomstkenmerken te vinden

  2. SQL/MySQL:een hoeveelheidswaarde op datum in meerdere rijen splitsen

  3. Dynamisch construeren van MySQL-code voor het maken van een trigger

  4. SQL Convert Nvarchar(255) naar DateTime probleem