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

Hlavní koncept zamykání SQL Serveru

V tomto příspěvku budeme diskutovat o mechanismu uzamčení serveru SQL Server a o tom, jak monitorovat zamykání serveru SQL Server pomocí standardních zobrazení dynamické správy serveru SQL Server. Než začneme vysvětlovat architekturu zámků SQL Serveru, věnujte chvíli popisu databáze ACID (Atomicity, Consistency, Isolation and Durability). Databázi ACID lze vysvětlit jako teorii databáze. Pokud se databáze nazývá relační databáze, musí splňovat požadavky na atomicitu, konzistenci, izolaci a trvanlivost. Nyní tyto požadavky stručně vysvětlíme.

Atomicita :Odráží princip nedělitelnosti, který popisujeme jako hlavní rys transakčního procesu. Transakční blok nelze nechat bez dozoru. Polovina zbývajícího transakčního bloku způsobuje nekonzistenci dat. Buď se provede celá transakce, nebo se transakce vrátí na začátek. To znamená, že všechny změny provedené transakcí se vrátí zpět a vrátí se do předchozího stavu.

Konzistence :Existuje pravidlo, které nastavuje podstrukturu pravidla o nedělitelnosti. Údaje o transakcích musí poskytovat konzistenci. To znamená, že pokud je operace aktualizace provedena v transakci, musí být provedeny buď všechny zbývající transakce, nebo musí být operace aktualizace zrušena. Tato data jsou velmi důležitá z hlediska konzistence.

Izolace :Toto je paket požadavku pro každou databázi transakcí. Změny provedené paketem požadavku musí být před dokončením viditelné pro jinou transakci. Každá transakce musí být zpracována samostatně. Všechny transakce musí být viditelné pro jinou transakci poté, co k nim dojde.

Trvanlivost: Transakce mohou provádět složité operace s daty. Aby byly všechny tyto transakce zabezpečené, musí být odolné vůči chybě transakce. Systémové problémy, které se mohou na SQL Serveru vyskytnout, by měly být připraveny a odolné proti výpadku napájení, operačnímu systému nebo jiným chybám způsobeným softwarem.

Transakce: Transakce je nejmenší zásobník procesu, který nelze rozdělit na menší části. Některé skupiny transakčních procesů lze také provádět postupně, ale jak jsme vysvětlili v principu atomicity, pokud i jedna z transakcí selže, selžou všechny transakční bloky.

Zamknout: Zámek je mechanismus zajišťující konzistenci dat. SQL Server uzamkne objekty při zahájení transakce. Po dokončení transakce SQL Server uvolní uzamčený objekt. Tento režim uzamčení lze změnit podle typu procesu SQL Server a úrovně izolace. Tyto režimy uzamčení jsou:

Hierarchie uzamčení: SQL Server má hierarchii zámků, která získává objekty zámků v této hierarchii. Databáze je umístěna v horní části hierarchie a řádek je umístěn ve spodní části. Níže uvedený obrázek znázorňuje hierarchii zámků serveru SQL Server.

Sdílené (S) zámky: Tento typ zámku nastává, když je třeba objekt přečíst. Tento typ zámku nezpůsobuje velké problémy.

Exkluzivní (X) zámky: Když nastane tento typ zámku, dojde k tomu, aby se zabránilo dalším transakcím upravit nebo získat přístup k uzamčenému objektu.

Aktualizovat (U) zámky: Tento typ zámku je podobný exkluzivnímu zámku, ale má určité rozdíly. Operaci aktualizace můžeme rozdělit do různých fází:fázi čtení a fázi zápisu. Během fáze čtení SQL Server nechce, aby ostatní transakce měly přístup k tomuto objektu, který se má změnit. Z tohoto důvodu používá SQL Server aktualizační zámek.

Zámky záměru: Zámek záměru nastane, když SQL Server chce získat sdílený zámek (S) nebo výhradní zámek (X) u některých prostředků níže v hierarchii zámků. V praxi, když SQL Server získá zámek na stránce nebo řádku, je v tabulce vyžadován zámek záměru.

Po všech těchto stručných vysvětleních se pokusíme najít odpověď na to, jak zámky identifikovat. SQL Server nabízí mnoho pohledů na dynamickou správu pro přístup k metrikám. K identifikaci zámků SQL Serveru můžeme použít sys.dm_tran_locks Pohled. V tomto zobrazení můžeme najít mnoho informací o aktuálně aktivních zdrojích správce zámků.

V prvním příkladu vytvoříme ukázkovou tabulku, která neobsahuje žádné indexy, a pokusíme se tuto ukázkovou tabulku aktualizovat.

CREATE TABLE TestBlock
(Id INT ,
Nm VARCHAR(100))

INSERT INTO TestBlock
values(1,'CodingSight')
In this step, we will create an open transaction and analyze the locked resources.
BEGIN TRAN
UPDATE TestBlock SET   Nm='NewValue_CodingSight' where Id=1
select @@SPID

Nyní zkontrolujeme zobrazení sys.dm_tran_lock.

select * from sys.dm_tran_locks  WHERE request_session_id=74

Toto zobrazení vrací mnoho informací o aktivních prostředcích zámku. Některým údajům v tomto pohledu však není možné porozumět. Z tohoto důvodu se musíme připojit k sys.dm_tran_locks pohled na další pohledy.

SELECT dm_tran_locks.request_session_id,
       dm_tran_locks.resource_database_id,
       DB_NAME(dm_tran_locks.resource_database_id) AS dbname,
       CASE
           WHEN resource_type = 'OBJECT'
               THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id)
           ELSE OBJECT_NAME(partitions.OBJECT_ID)
       END AS ObjectName,
       partitions.index_id,
       indexes.name AS index_name,
       dm_tran_locks.resource_type,
       dm_tran_locks.resource_description,
       dm_tran_locks.resource_associated_entity_id,
       dm_tran_locks.request_mode,
       dm_tran_locks.request_status
FROM sys.dm_tran_locks
LEFT JOIN sys.partitions ON partitions.hobt_id = dm_tran_locks.resource_associated_entity_id
LEFT JOIN sys.indexes ON indexes.OBJECT_ID = partitions.OBJECT_ID AND indexes.index_id = partitions.index_id
WHERE resource_associated_entity_id > 0
  AND resource_database_id = DB_ID()
 and request_session_id=74
ORDER BY request_session_id, resource_associated_entity_id

Na obrázku výše můžete vidět uzamčené zdroje. SQL Server získá výhradní zámek v tomto řádku. (RID :Identifikátor řádku používaný k uzamčení jednoho řádku v hromadě) Zároveň SQL Server získá výhradní zámek na stránce a TestBlock stůl. Znamená to, že žádný jiný proces nemůže číst tento prostředek, dokud SQL Server neuvolní zámky. Toto je základní mechanismus zámku na serveru SQL.

Nyní vyplníme některá syntetická data do naší testovací tabulky.

TRUNCATE TABLE 	  TestBlock
DECLARE @K AS INT=0
WHILE @K <8000
BEGIN
INSERT TestBlock VALUES(@K, CAST(@K AS varchar(10)) + ' Value' )
SET @[email protected]+1
 END
After completing this step, we will run two queries and check the sys.dm_tran_locks view.
BEGIN TRAN
 UPDATE TestBlock  set Nm ='New_Value' where Id<5000

Ve výše uvedeném dotazu SQL Server získá výhradní zámek na každém jednotlivém řádku. Nyní spustíme další dotaz.

BEGIN TRAN
 UPDATE TestBlock  set Nm ='New_Value' where Id<7000

Ve výše uvedeném dotazu SQL Server vytvoří výhradní zámek na tabulce, protože SQL Server se pokusí získat mnoho zámků RID pro tyto řádky, které budou aktualizovány. Tento případ způsobuje velkou spotřebu prostředků v databázovém stroji. Proto SQL Server automaticky přesune tento exkluzivní zámek do objektu vyšší úrovně, který je v hierarchii zámků. Tento mechanismus definujeme jako eskalaci zámku. Eskalaci zámku lze změnit na úrovni tabulky.

ALTER TABLE XX_TableName
SET
(
	LOCK_ESCALATION = AUTO -- or TABLE or DISABLE
)
GO

Rád bych přidal několik poznámek o eskalaci zámku. Pokud máte rozdělenou tabulku, pak můžeme nastavit eskalaci na úroveň oddílu.

V tomto kroku provedeme dotaz, který vytvoří zámek v tabulce AdventureWorks HumanResources. Tato tabulka má seskupené a neseskupené indexy.

BEGIN TRAN	
UPDATE 	  [HumanResources].[Department] SET Name='NewName' where DepartmentID=1

Jak můžete vidět v níže uvedeném podokně výsledků, naše transakce získává výhradní zámky v indexovém klíči clusteru PK_Department_DepartmentID a také získává výhradní zámky v neklastrovaném indexovém klíči AK_Department_Name. Nyní si můžeme položit tuto otázku:„Proč SQL Server zamyká index bez klastrů?“

Jméno sloupec je indexován v neklastrovaném indexu AK_Department_Name a my se snažíme změnit Název sloupec. V tomto případě SQL Server potřebuje změnit všechny indexy bez clusterů v tomto sloupci. Neklastrovaná úroveň indexového listu zahrnuje každou vytříděnou hodnotu KEY.

Závěry

V tomto článku jsme zmínili hlavní linie mechanismu uzamčení serveru SQL Server a zvážili použití sys.dm_tran_locks. Zobrazení sys.dm_tran_locks vrací mnoho informací o aktuálně aktivních prostředcích zámku. Pokud google, můžete najít spoustu vzorových dotazů o tomto zobrazení.

Odkazy

Příručka zamykání transakcí serveru SQL a verzování řádků

SQL Server, uzamkne objekt


  1. Připojte se ke vzdálené databázi PostgreSql pomocí Powershell

  2. Brána PL/SQL v R11i

  3. 4 Funkce, které vracejí sekundovou část z časové hodnoty v MariaDB

  4. Lepší ALTER než DROP