it-swarm-eu.dev

Co je blokování a jak k tomu dochází?

Pokusil jsem se najít nějaké informace o blokování na serveru SQL, ale nemohl jsem najít stručné vysvětlení toho, co to je a jak k tomu dochází. Mohl byste mě prosím poučit?

20
jrara

Analogie

Někdy to pomáhá používat analogie mimo počítače.

Řekněme, že máte míč a dvě děti. Míč může mít pouze jedno dítě. Pokud však jedno z dětí dostane míč a neopustí ho, protože je rozptýleno (například při sledování televize), druhé dítě se s míčem nebude hrát.

Druhé dítě je z tohoto zdroje zablokováno.

Pokud to porovnáme například s televizí, několik dětí může sledovat televizi v jednom okamžiku.

Zámky

Pokud se přesuneme do světa databází, zjistíme, že existují různé způsoby, jak používat zdroje (stejně jako naše dva příklady výše). Můžeme provádět "čtení" nebo můžeme provádět "zápisy".

Když chceme data číst, není důvod, aby data také nemohli číst ostatní - stejně jako dva lidé sledující televizi. Pokud však chceme data zapsat, musíme se ujistit, že se na ně nikdo jiný nedívá. Pokud ji čtou, zatímco ji píšeme, dostanou „špinavé“ čtení. (To znamená, že uvidí data částečně napsaná, což bude neplatné.)

Abychom se ujistili, že tyto špinavé čtení nikdy nenastanou, máme dva primární typy zámků, zámky na čtení a exkluzivní zámky.

Zámek čtení

Můžete mít několik různých připojení čtení ze stejného zdroje dat v daném okamžiku. Ale aby bylo zajištěno, že nikdo data nezmění, když je čtou, uzavřou zámek pro čtení.

Jakmile má připojení na některém datu zámek čtení, musí všechna ostatní připojení počkat, než uvolní zámek čtení, než budou moci zapsat data. Jiní však mohou na tom samém datu uzavřít vlastní zámky pro čtení.

Exkluzivní zámek

Pokud připojení chce aktualizovat/vložit/odstranit část dat, musí uzavřít exkluzivní zámek. Tím se zabrání jakémukoli jinému připojení, aby také uzavřel zámek dat (učinil zámek výhradním pro toto připojení).

Pokud má připojení výhradní zámek dat, nesmí se z dat číst žádná další připojení. To pomáhá zabránit znečištění čtení tím, že pojistí, že nikdo nemůže číst data, zatímco jsou zapsána.

Blokování

„Blokování“ je jednoduše termín, který znamená, že jedno připojení drží zámek na prostředku, když si ho chce jiné připojení přečíst nebo zapsat. Neznamená to nutně, že připojení vlastníka jej neuvolní, pouze to, že jej aktuálně drží.

Srovnejte to s případem, kdy dítě drží míč. Dítě držící míč blokuje všechny ostatní děti v držení míče.

Deadlock

Vím, že jste se na to neptali, ale je to jen jeden další krok, abyste se dostali k zablokování (a velmi úzce souvisí s blokováním).

Zablokování se může stát, když máte dvě připojení, z nichž každá má zámek, ale chtějí navzájem zdroje. V tomto scénáři je to jako dvě děti, z nichž každé má míč, ale chce to druhé.

Stejně jako děti, tato spojení nejsou ochotna sdílet vůbec. Každé připojení potřebuje přístup k oběma prostředkům, aby mohlo pokračovat. Jsou však ve stavu trvalého blokování. V tomto stavu musí přijít nadřazený (DBMS) a vybrat poražený, aby jeden z dětí (připojení) mohl mít přístup k oběma prostředkům.

Jakmile je toto „vítězné“ připojení hotovo, uvolní prostředky a poté se další („ztracené“) připojení může pokusit znovu získat oba zdroje.

Koncept zablokování je tedy tam, kde máte dva zdroje, které se navzájem blokují.


Zde si můžete přečíst více o všech různých typech zámků, které SQL Server nabízí, ao různých prostředcích, které mohou způsobit blokování/zablokování. Tento článek je starý, ale stále platí pro SQL Server 2000 až 2008 R2. (Existuje několik dalších typů zámků přidaných do novějších verzí serveru SQL, ale to vám poskytne výchozí bod.)

23
Richard

Skvělé vysvětlení Richarda, ale chtěl jen přidat odkazy na oficiální dokumentaci. Tato témata byla napsána pro server SQL Server 2000, ale většina konceptů zůstává stejná i dnes:

Porozumění a zamezení blokování

Porozumění uzamčení na serveru SQL

Upravit - některé dodatky:

Všichni 3 jsou velmi dobře známí autoři SQL Serveru a/nebo MVP.

5
Aaron Bertrand