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

OBJEDNAT DO a S (ROWLOCK, UPDLOCK, READPAST)

Podle očekávání

  • SELECT s ORDER BY, bez ROWLOCK, bez indexu bude mít zámek tabulky kvůli skenování/přechodnému řazení, aby vyšlo TOP 2. Takže 2. relace přeskočí celou tabulku kvůli READPAST

  • SELECT bez ORDER BY pouze vybírá libovolné 2 řádky, které jsou náhodou v pořadí vložení (čirá náhoda, neexistuje žádné předpokládané pořadí). Skutečnost, že tyto 2 řádky jsou uzamčeny, způsobí, že 2. relace přeskočí na další nezamknuté řádky.

SQL Server se pokouší udržet zámky co nejpodrobnější, ale skenování znamená zámek tabulky. Nyní by to normálně nedělalo rozdíl (bylo by to sdílený zámek čtení), ale máte také UPDLOCK, což znamená výhradně zamčenou tabulku

Takže potřebujete obojí

  • 3 tipy v dotazech SELECT (ROWLOCK, UPDLOCK, READPAST) pro ovládání granularity, izolace a souběžnosti.
    Použití pouze ROWLOCK způsobí výhradní zámek na každém řádku pro skenování/třídění.
  • index na Value INCLUDE TestID aby byl SELECT efektivní. Pouze index pravděpodobně opraví souběžnost, ale nebude zaručena.

V jedné z vašich předchozích otázek jsem propojil svou odpověď (v komentáři) na Podmínka závodu ve frontě procesu serveru SQL kde mám všechny 3 tipy na zámek




  1. Implementace zabezpečení na úrovni řádků v SQL Server 2008

  2. Připojení Oracle k SQL Serveru z Windows

  3. jak zvýšit hodnotu proměnné o 1 pro každý záznam pomocí php mysql LOAD DATA INFILE

  4. Použití nástrojů hibernace k reverzní analýze pojos z Postgresu