Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So sperren Sie eine Zeile exklusiv, die den CRUD-Vorgang verhindert

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

Das reicht aus.

BEARBEITEN

Wie von anderen angemerkt, können Sie eine Zeile nicht sperren, damit sie nicht gelesen wird . Die einzige Möglichkeit, die ich dafür kenne, ist die folgende:

WITH (UPDLOCK, TABLOCK)

Und dies setzt voraus, dass ein WITH (NOLOCK) niemals in einer SELECT-Anweisung verwendet wird (was sowieso vermieden werden sollte).

Ich habe dies getestet und es wird funktionieren, obwohl TABLOCK nur in extremen Fällen verwendet werden sollte. Wenn Parallelität erforderlich ist, ist dies sicherlich eine schlechte Lösung, und es wäre eine andere Form der Sperrung erforderlich. Eine Möglichkeit besteht darin, eine Bit-Spalte "Available True/False" zu aktualisieren und nur Zeilen zu lesen, bei denen "Available" ="True" ist. Wie @gbn vorgeschlagen hat, könnte READPAST damit verwendet werden.