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

Výchozí změny úrovně izolace SQL serveru

Ve vašem scénáři bych doporučil explicitně nastavit úroveň izolace na snímek - to zabrání tomu, aby čtení překáželo zápisu (vkládání a aktualizace) tím, že zabrání uzamčení, přesto by toto čtení bylo stále "dobré" čtení (tj. ne špinavá data - není to totéž jako NOLOCK)

Obecně zjišťuji, že tam, kde mám se svými dotazy problémy se zamykáním, ručně ovládam použitý zámek. např. Provedl bych aktualizace pomocí zámků na úrovni řádků, abych se vyhnul zamykání na úrovni stránky/tabulky, a nastavil bych čtení na readpast (akceptuji, že mi mohou chybět některá data, v některých scénářích to může být v pořádku)link|edit|delete|flag

EDIT-- Sloučení všech komentářů do odpovědi

Jako součást procesu optimalizace se SQL server vyhýbá tomu, aby se na stránce, o které ví, že se nezměnila, nestala potvrzená čtení, a automaticky se vrátí ke strategii menšího zamykání. Ve vašem případě sql server klesne ze serializovatelného čtení na opakovatelné čtení.

Otázka:Děkujeme za užitečné informace týkající se snižování úrovní izolace. Napadá vás nějaký důvod, proč by na prvním místě používala Serializable IsolationLevel, vzhledem k tomu, že pro SELECT nepoužíváme explicitní transakci – pochopili jsme, že implicitní transakce bude používat ReadCommitted?

Odpověď:Ve výchozím nastavení bude SQL Server používat Read Commmited, pokud je to vaše výchozí úroveň izolace, ALE pokud ve svém dotazu dodatečně neurčíte strategii zamykání, v podstatě říkáte serveru sql „udělejte, co si myslíte, že je nejlepší, ale moje preference je Read Commited“. Vzhledem k tomu, že SQL Server je svobodná volba, tak to dělá za účelem optimalizace dotazu. (Algoritmus optimalizace na serveru SQL je velmi složitý a sám mu plně nerozumím). Pokud není explicitně provedeno v rámci transakce, neovlivňuje to úroveň izolace, kterou server SQL používá.

Otázka:Poslední věc, zdá se rozumné, že by SQL Server zvýšil úroveň izolace (a pravděpodobně i počet požadovaných zámků) pro optimalizaci dotazu? Také by mě zajímalo, zda by to ovlivnilo opětovné použití sdruženého připojení, pokud by zdědilo poslední použitou úroveň izolace?

Odpověď:SQL server to udělá jako součást procesu zvaného „Lock Eskalace“. Z http://support.microsoft.com/kb/323630 , cituji:"Microsoft SQL Server dynamicky určuje, kdy provést eskalaci zámků. Při tomto rozhodování SQL Server bere v úvahu počet zámků, které jsou drženy při konkrétním skenování, počet zámků, které jsou drženy celou transakcí, a paměť, která se používá pro zámky v systému jako celku. Výchozí chování SQL Serveru obvykle vede k tomu, že eskalace zámků nastane pouze v těch bodech, kde by to zlepšilo výkon, nebo když musíte snížit nadměrnou paměť systémových zámků na rozumnější úroveň. Některé návrhy aplikací nebo dotazů však mohou vyvolat eskalaci zámku v době, kdy to není žádoucí, a zámek eskalované tabulky může blokovat ostatní uživatele“.

Ačkoli eskalace uzamčení není přesně to samé jako změna úrovně izolace, pod kterou dotaz běží, překvapuje mě to, protože bych neočekával, že sql server bude přijímat více zámků, než povoluje výchozí úroveň izolace.



  1. InMemory DUPLICATE Zmatek v Oracle RAC

  2. MySQL importovat databázi, ale ignorovat konkrétní tabulku

  3. MariaDB DATABASE() Vysvětleno

  4. [AKTUALIZOVÁNO 2] Kritické:Office Update přeruší přístup – Dotaz je poškozený