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.