sql >> Databáze >  >> RDS >> Sqlserver

Jak výhradně zamknout řádek, který brání provozu CRUD

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

To bude stačit.

UPRAVIT

Jak poznamenali ostatní, nemůžete řádek uzamknout, aby nebyl přečten . Jediný způsob, jak to udělat, je následující:

WITH (UPDLOCK, TABLOCK)

A to za předpokladu, že WITH (NOLOCK) není nikdy použito v příkazu SELECT (čemuž je třeba se stejně vyhnout).

Testoval jsem to a bude to fungovat, i když TABLOCK by se měl používat pouze v extrémních případech. Určitě, pokud je vyžadována souběžnost, je to špatné řešení a byla by potřeba nějaká jiná forma zamykání. Jedním ze způsobů je aktualizovat bitový sloupec "Available True/False" a číst pouze řádky, kde Available =True. Jak navrhl @gbn, READPAST mohlo být použit s tímto.



  1. Vkládejte seškrabovaná data tabulky přímo do PostgreSQL db

  2. Vložit pouze v případě, že se hodnoty liší od předchozího záznamu s vícenásobným vložením?

  3. Časový limit dotazu SQL Server

  4. Oracle SQL Transpose