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

Co je zablokování serveru SQL?

Existuje mnoho důvodů, proč mohou aplikace reagovat pomalu, ale pokud si uživatelé stěžují na výkon, možná máte co do činění se zablokováním serveru SQL. Naštěstí existují způsoby, jak identifikovat a opravit zablokování SQL Serveru a dokonce mu zabránit v negativním ovlivnění výkonu aplikace.

Zablokování serveru SQL Server je v podstatě mezník mezi dvěma procesy, které soutěží o výhradní přístup ke stejnému prostředku. Vzhledem k tomu, že pouze jeden proces může používat prostředek současně, výkon se zpomaluje, dokud se nevyřeší zablokování.

Existují dva typy zablokování serveru SQL Server, na které je třeba dávat pozor:zámky převodu a zámky cyklu.

Zablokování zámku převodu nastává, když se vlákno pokouší převést zámek z jednoho exkluzivního typu na jiný exkluzivní typ, ale nedaří se to, protože jiné vlákno již má sdílený zámek na prostředku, který se první vlákno pokouší převést.

Na serveru SQL Server existují tři typy zámků převodu:

  • Shared with intent exclusive (SIX):Tento zámek nastane, když transakce, která má sdílený zámek, má také exkluzivní zámek na některých stránkách nebo řádcích.
  • Sdíleno s aktualizací záměru (SIU):K tomuto uzamčení dochází, když transakce, která má sdílený zámek, má také některé stránky nebo řádky uzamčené aktualizačním zámkem.
  • Aktualizace s výhradním záměrem (UIX):K tomuto uzamčení dochází, když transakce, která má aktualizační zámek, má také exkluzivní zámek na některých stránkách nebo řádcích.

Cyklické zámky jsou zablokování serveru SQL Server způsobené dvěma procesy soupeřícími o výhradní zámek pro prostředek, který je uzamčen druhým procesem.

Například Proces 1 drží zámek na Zdroji 1, zatímco čeká, až Proces 2 uvolní svůj zámek na Zdroji 2. Pokud Proces 2 drží zámek na Zdroji 2 a čeká, až Proces 1 uvolní Zdroj 1, máme sami sebe uváznutí zámku cyklu.

Jak diagnostikovat zablokování serveru SQL Server

Zablokování serveru SQL Server je jen jedním z desítek možných důvodů, proč může mít vaše aplikace problémy s výkonem. Pokud se dotazy, které normálně běží rychle, náhle zpomalí, je možné, že došlo k uváznutí. Ale je také možné, že se děje něco jiného.

Jak tedy s jistotou určit, zda za problémy s výkonem databáze může uváznutí, kromě toho, že si všimnete snížené rychlosti dotazů?

Nejjednodušší a nejpřesnější způsob, jak identifikovat uváznutí, je přítomnost chybové zprávy 1205:

Transakce (ID procesu %d) byla zablokována na zdrojích %.*ls s jiným procesem a byla vybrána jako oběť zablokování. Spusťte transakci znovu.

Chybová zpráva 1205 vám doslova říká, že došlo k uváznutí a jak jej opravit. Jak však zdůrazňuje Jeremiah Peschka, pokud jste neopravili příčinu zablokování, opětovné spuštění transakce bude pravděpodobně neúspěšné.

Další možností, jak najít zablokování, je vytáhnout graf zablokování serveru SQL Server z rozšířených událostí. Extrahování zablokování prostřednictvím Extended Events vám umožní podívat se na zablokování XML, které poskytuje více informací než grafické znázornění grafu zablokování.

Zablokování XML je organizováno podle seznamu obětí, seznamu procesů a seznamu zdrojů. Každá část obsahuje podrobné popisy obětí, procesů a zdrojů zapojených do uváznutí, což usnadňuje odstraňování a řešení problému.

Jak opravit zablokování serveru SQL Server

Jediným způsobem, jak vyřešit zablokování serveru SQL Server, je ukončit jeden z procesů a uvolnit uzamčený prostředek, aby se proces mohl dokončit. K tomu dochází automaticky, když SQL Server detekuje uváznutí a ukončí jeden z konkurenčních procesů (tj. oběť).

SQL Server obvykle náhodně vybere, které připojení se má ukončit, ale je možné nastavit priority zablokování, abyste určili, které připojení je během zablokování ukončeno. Když mají dvě připojení různá nastavení priority, SQL Server ukončí transakci s nejnižší prioritou.

Jak zabránit zablokování serveru SQL Server

Zablokování SQL Serveru je běžnou skutečností, když spravujete zaneprázdněnou databázi. DBA však mohou pomoci snížit výskyt uváznutí a minimalizovat jejich dopad na výkon databáze přijetím několika preventivních opatření:

  • Vytvářejte lepší indexy
  • Upravte priority transakcí
  • Aktivujte model Vyzkoušet/Opakovat
  • Změňte režimy izolace
  • Podržte zámky co nejkratší dobu
  • Získejte přístup ke zdrojům pokaždé ve stejném pořadí
  • Neodesílejte transakci, dokud nemáte všechny potřebné informace
  • Eskalace omezení uzamčení

Ačkoli není možné zcela zabránit uváznutí SQL Serveru, můžete implementovat tyto osvědčené postupy a proaktivně obejít některé z nejběžnějších zdrojů uváznutí, abyste udrželi hladký tok transakcí a optimalizovali výkon databáze.


  1. Měl bych používat makra nebo kód VBA?

  2. Jak funguje SQLite Count()

  3. Jak vytvořit složený primární klíč v MySQL

  4. aktualizace a komprimace databáze sqlite v systému Android