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

Spravujte souběžnost transakcí pomocí zámků na serveru SQL Server

Ve víceuživatelském prostředí je nezbytné zachovat souběžnost zkrácení. Tyto zámky jsou struktury v paměti o velikosti 96 bajtů. Jejich úlohou je udržovat integritu dat, konzistenci, kontrolu souběžnosti pro každou transakci. SQL Server se řídí ACID testem pro každou transakci.

  • A tomicity:Tato vlastnost zajišťuje, že transakce zahrnující dva nebo více procesů bude plně potvrzena nebo nebude potvrzen žádný z procesů.
  • C onsistency:Poskytuje vám záruku o stavu potvrzené transakce. Transakce by měla buď vytvořit nový stav dat, nebo se vrátit do stávajícího stavu (před transakcí).
  • Solation:Znamená, že transakce jsou od sebe navzájem izolované. Pokud transakce běží a nepotvrdila data, je izolována od ostatních transakcí.
  • D použitelnost:Trvanlivost zajišťuje, že vaše svěřená data se nikdy neztratí. Zabraňuje selhání napájení a operačního systému nebo jiným chybám způsobeným softwarem.

Aby byly zajištěny vlastnosti ACID, SQL Server ukládá objektům různé druhy zámků. V tomto případě musí ostatní transakce počkat, dokud se zámek neuvolní.

Režimy zamykání

SQL Server používá pro každou transakci následující režimy zamykání.

  • Sdílené zámky:
    • V tomto zámku SQL Server umožňuje ostatním relacím provádět vybrané operace pro čtení dat. Zabrání však aktualizacím, dokud nebude zámek aktivní.
    • Více transakcí může současně použít sdílený zámek na řádek nebo stránku.
    • Je to běžný zámek, který vidíte na svých databázových objektech.

V následujícím T-SQL získáme záznam zákazníka pro konkrétní ID zákazníka. Dále používáme dynamické zobrazení správy sys.dm_tran_locks ke kontrole existujících zámků.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Jak je uvedeno níže, má sdílený zámek na daném ID prostředku (8194443284a0):

  • Exkluzivní (X) zámky:
    • SQL Server používá výhradní zámek (X) pro operace DML (Delete, Insert nebo Update), které vyžadují úpravu dat řádku nebo stránky.
    • Zabraňuje ostatním uživatelům v přístupu ke zdroji, dokud není umístěn zámek.
    • SQL Server může mít pouze jeden výhradní zámek na stránce nebo řádku pro transakci.

V tomto příkladu chceme aktualizovat záznamy pro ID zákazníka 1. SQL Server proto vyžaduje výhradní zámek prostředku. Žádná jiná transakce nemůže získat výhradní zámek tohoto zdroje, dokud nebude transakce dokončena.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Aktualizovat (U) zámky:
    • Zámek Update je podobný exkluzivnímu zámku. Lze jej umístit na záznam se sdíleným zámkem.
    • Zámek aktualizace umístí další sdílený zámek na konkrétní řádek. Jakmile může SQL Server upravit záznamy, převede zámek aktualizace na výhradní zámek.
    • SQL Server nemůže umístit sdílený zámek na prostředek s aktualizačním zámkem.
    • Můžete také použít WITH UPDLOCK pro vynucení aktualizačního zámku.

Následující příklad ukazuje zámek aktualizace pro ID prostředku (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Zámky záměru:
    • Jeho účelem je informovat transakci o jejím záměru získat zámek. Dochází k němu, když transakce vyžaduje sdílený nebo výhradní zámek na zdrojích níže v hierarchii.
    • Transakce neumožňuje jiným transakcím získat exkluzivní zámek na stole pomocí zámku záměru.
    • Typy zámků záměrů jsou uvedeny níže.
      • Zámek sdíleného záměru (IS):Označuje záměr serveru SQL číst prostředky nižší hierarchie tím, že na těchto zdrojích nižší hierarchie získá sdílený zámek jednotlivě.
      • Zámek výhradního záměru (IX):Označuje záměr serveru SQL upravit prostředky nižší hierarchie získáním výhradního zámku pro prostředky nižší hierarchie.
      • Zámek aktualizace záměru (IU):Lze jej získat na úrovni stránky pouze pro nižší hierarchické zdroje a po dokončení aktualizace se převede na zámek IX.

Jak je znázorněno níže, transakce má na klíči výhradní zámek a na úrovni stránky má výhradní zámek záměru.

Zámky převodu

SQL Server převádí typy zámků na podporu více dotazů v transakci. Tyto zámky jsou známé jako převodní zámky.

  • SIX – Sdílený s výhradním zámkem Intent:Transakce serveru SQL obsahuje sdílený zámek na několika stránkách a má exkluzivní uzamknout na několika řadách.
  • SIU – transakce serveru SQL obsahuje sdílený zámek na několika stránkách a má aktualizaci uzamknout na několika řadách.
  • UIX – Aktualizace s výhradním zámkem záměru:Transakce serveru SQL má zámek aktualizace na několika stránkách a má výhradní uzamknout na několika řadách.

Zámky schématu

SQL Server získává dva druhy zámků schématu.

  • Zámek stability schématu (Sch-S):Tento zámek se používá při kompilaci dotazu závislého na schématu a při generování plánu jeho provádění. Zámek Sch-S neblokuje žádný přístup k datům objektu.
  • Zámek modifikace schématu (Sch-M):Tento zámek je výsledkem spuštění dotazu DDL (Data Definition Language). SQL Server může mít na objektu pouze jeden zámek modifikace schématu. Pomocí tohoto zámku schématu nemůžete upravit objekt.

V níže uvedeném příkladu získáme zámky Sch-S i Sch-M při úpravě definice objektu.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Kompatibilita zámku

Kompatibilita zámku je užitečná pro kontrolu povolených zámků v případě více transakcí ve stejném zdroji současně. Pokud transakce umístí zámek, nový zámek umístěný jinou transakcí by s ním měl být kompatibilní. Proto si můžete projít následující seznam kompatibility zámků a najít podporované zámky během více transakcí.

Zamknout eskalace

SQL Server zavedl funkci eskalace uzamčení, aby se zabránilo příliš velkému zamykání, které by mohlo způsobit tlak na paměť. SQL Server dynamicky zvažuje počet zámků držených při konkrétním skenování a počet zámků držených celou transakcí a pamětí. SQL Server převádí zámky nízké úrovně na zámky vysoké úrovně při eskalaci zámků. Například převádí zámky řádků na zámky na úrovni stránky.

Pro eskalace zámku používá následující práh.

  • Práh paměti: Práh paměti zámku je nastaven na 40 procent paměti zámku.
  • Práh zámku: Pokud je počet zámků získaných v aktuální tabulce nebo indexu větší než 5000, lze spustit eskalace zámků.

Uživatelé mohou ovládat eskalace uzamčení pomocí příkazu alter table. Eskalace uzamčení pro tuto tabulku můžete zcela zakázat pomocí hodnoty parametru DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

Můžete se podívat na dokumentaci společnosti Microsoft pro podrobné pochopení eskalace zámku.

Poznámka:Eskalace uzamčení byste neměli deaktivovat, dokud nebude důkladně otestována v nižším prostředí a doporučujeme ji používat pouze zkušenými správci databází.

Závěr

Tento článek poskytuje podrobný přehled zámků serveru SQL Server a DMV ke sledování zámku a jeho procesu eskalace. Zamykání je na SQL Serveru docela normální chování a měli byste ho znát, abyste pochopili, jak funguje více transakcí, simulace a poskytování konzistentních dat.


  1. SQLite Order By

  2. Postgres je nejlepší databáze – Důvod č. 2:Licence

  3. SQLite Limit

  4. Mám v MySQL použít datový typ datetime nebo timestamp?