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

Pochopení SQL Server LOCKS na SELECT dotazy

A SELECT v SQL Server umístí sdílený zámek na řádku tabulky - a druhý SELECT by také vyžadoval sdílený zámek a ty jsou vzájemně kompatibilní.

Takže ne - jeden SELECT nemůže zablokovat další SELECT .

Co je WITH (NOLOCK) nápověda k dotazu se používá k tomu, aby bylo možné číst data, která jsou v procesu vkládání (jiným připojením) a která ještě nebyla potvrzena.

Bez této nápovědy k dotazu SELECT může být zablokováno čtení tabulky probíhajícím INSERT (nebo UPDATE ) prohlášení, které uvádí exkluzivní uzamknout řádky (nebo možná celou tabulku), dokud nebude transakce dané operace potvrzena (nebo vrácena zpět).

Problém WITH (NOLOCK) rada je:možná čtete datové řádky, které nakonec nebudou vloženy vůbec (pokud INSERT transakce je vrácena zpět) - takže váš např. report může zobrazit data, která nikdy nebyla do databáze skutečně vložena.

Existuje další nápověda k dotazu, která by mohla být užitečná – WITH (READPAST) . To dává pokyn SELECT příkaz pouze přeskočit všechny řádky, které se pokouší číst a které jsou výhradně uzamčeny. SELECT nebude blokovat a nebude číst žádná "špinavá" nepotvrzená data - ale může přeskočit některé řádky, např. nezobrazovat všechny řádky v tabulce.



  1. Jaký je rozdíl mezi použitím křížového spojení a vložením čárky mezi dvě tabulky?

  2. Co je rychlejší, SELECT DISTINCT nebo GROUP BY v MySQL?

  3. OracleCommand SQL Parameters Binding

  4. Oracle - ORA-01489:výsledek zřetězení řetězců je příliš dlouhý