Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment verrouiller exclusivement une ligne qui empêche l'opération CRUD

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

Cela fera l'affaire.

MODIFIER

Comme noté par d'autres, vous ne pouvez pas verrouiller une ligne pour qu'elle ne soit pas lue . La seule façon que je connaisse de le faire est la suivante :

WITH (UPDLOCK, TABLOCK)

Et cela suppose qu'un WITH (NOLOCK) n'est jamais utilisé dans une instruction SELECT (ce qui devrait être évité de toute façon).

J'ai testé cela et cela fonctionnera, bien que TABLOCK ne devrait être utilisé que dans des cas extrêmes. Certes, si la concurrence est requise, c'est une mauvaise solution et une autre forme de verrouillage serait nécessaire. Une façon consiste à mettre à jour une colonne de bits "Available True/False" et à ne lire que les lignes où Available =True. Comme @gbn l'a suggéré, READPAST pourrait être utilisé avec ceci.