Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 13898|Odpověď: 0

[Zdroj] Zámky, špinavé čtení, neopakovatelné a falešné čtení v SQL

[Kopírovat odkaz]
Zveřejněno 20.07.2016 12:37:53 | | |
Přehled zdymadel
1. Proč zavádět zámky
Když více uživatelů provádí současně operace s databází, dochází k následujícím datovým nesrovnalostim:
Chybějící aktualizace
Dva uživatelé, A a B, čtou stejná data a upravují je, a výsledek jedné úpravy zničí výsledek druhé úpravy, například systém rezervace vstupenek
Špinavé čtení
Uživatel A data upraví a poté uživatel B data přečte, ale uživatel A z nějakého důvodu změnu dat zruší a data se vrátí na původní hodnotu
Nečtěte opakovaně
Uživatel A data čte a uživatel B je pak čte a upravuje
Hlavní metodou řízení souběžnosti je blokování, což znamená zakázat uživatelům provádět určité operace po určitou dobu, aby se předešlo nekonzistencím dat

2. Klasifikace zdymadel
Existují dvě dělení do kategorií zdymadel:
1 . Z pohledu databázového systému: je rozdělen na exkluzivní zámky (tj. exkluzivní zámky), sdílené zámky a aktualizační zámky
MS - SQL Server používá následující vzory zámků zdrojů.
Popis režimu zámku
Share(y) se používá pro operace, které nemění ani neaktualizují data (operace pouze pro čtení), například příkazy SELECT.
Update (U) se používá v aktualizovatelných zdrojích. Zabraňuje běžným formám zablokování při čtení, uzamčení více relací a možná i aktualizaci zdrojů.
Exclusive (X) se používá pro operace úpravy dat, jako jsou INSERT, UPDATE nebo DELETE. Ujistěte se, že na stejném zdroji neprobíhá více aktualizací současně.
Záměrné zámky se používají k vytvoření hierarchie zámků. Typy zámků záměru jsou: Sdílený záměr (IS), Záměr exkluzivní (IX) a Záměr výlučný (SIX).
Schema locky se používají při provádění operací, které závisí na schématu tabulky. Typy schema zámků jsou: modifikace schématu (Sch -M) a stabilita schématu (Sch -S).
Hromadné aktualizace (BU) se používají, když jsou do tabulky zkopírovány velké objemy dat a je specifikována TABLOCK nápověda.
Sdílené zámky
Sdílený zámek umožňuje současným transakcím číst (SELECT) zdroj. Pokud na zdroji existuje sdílený (S) zámek, žádná jiná transakce nemůže data upravit. Uvolněte sdílený (S) zámek na zdroji ihned po přečtení dat, pokud není úroveň izolace transakce nastavena na opakovatelnou nebo vyšší, nebo pokud sdílený (S) zámek není zachován s náznakem zámku po celou dobu trvání transakce.
Aktualizační zámek
Aktualizační (U) zámky zabraňují zablokování v obvyklé podobě. Typický vzor aktualizace spočívá v transakci, která přečte záznam, získá sdílený (S) zámek pro zdroj (stránku nebo řádek) a poté upraví řádek, což vyžaduje převod zámku na výhradní (X) zámek. Pokud dvě transakce získají zámek ve sdíleném režimu na zdroji a poté se pokusí současně aktualizovat data, jedna transakce se pokusí převést zámek na exkluzivní (X) zámek. Přechod ze sdíleného režimu do exkluzivního zámku musí chvíli počkat, protože exkluzivní zámek jedné transakce není kompatibilní se sdíleným režimem zámku jiné transakce; Dochází k čekání na zámek. Druhá transakce se snaží získat exkluzivní (X) zámek pro aktualizaci. K zablokování dochází, protože obě transakce jsou převedeny na exkluzivní (X) zámky a každá transakce čeká, až druhá transakce uvolní zámek sdíleného režimu.
Aby se tomuto možnému problému s zablokováním předešlo, použijte aktualizovaný (U) zámek. Pouze jedna transakce najednou může získat aktualizovaný (U) zámek pro zdroj. Pokud transakce modifikuje zdroj, aktualizační (U) zámek se převede na exkluzivní (X) zámek. Jinak je zámek převeden na sdílený.
Exkluzivní zámky
Exkluzivní (X) zámky brání souběžným transakcím v přístupu ke zdrojům. Jiné transakce nemohou číst ani měnit data zamčená výhradním (X) zámkem.
Záměrový zámek
Zámek záměru znamená, že SQL Server potřebuje získat sdílený (S) zámek nebo exkluzivní (X) zámek na některé základní zdroje v hierarchii. Například zámek záměru podílu umístěný na úrovni tabulky znamená, že transakce má v úmyslu uzavřít zámek podílu na stránce nebo řádku v tabulce. Nastavení záměrného zámku na úrovni tabulky zabraňuje jinému, aby jiná transakce následně získala exkluzivní (X) zámek na tabulce, která tuto stránku obsahuje. Záměrové zámky mohou zlepšit výkon, protože SQL Server kontroluje záměr pouze na úrovni tabulky, aby zjistil, zda transakce bezpečně získá zámek na dané tabulce. Místo kontroly zámků na každém řádku nebo stránce tabulky, zda transakce může uzamknout celou tabulku.
Zámky záměru zahrnují Sdílení záměru (IS), Exkluzivní záměr (IX) a Záměrné exkluzivní sdílení (SIX).
Popis režimu zámku
Sdílení záměru (IS) označuje, že záměrem transakce jsou některé, nikoli všechny základní zdroje v hierarchii čtení, a to tím, že se na každý zdroj umístí S-zámky.
Exkluzivní záměr (IX) označuje, že záměrem transakce je upravit některé, ale ne všechny, základní zdroje v hierarchii tím, že na každý zdroj umístí X-lock. IX je nadmnožina IS.
Výhradní sdílení s úmyslem (SIX) znamená, že záměrem transakce je přečíst všechny základní zdroje v hierarchii a upravit některé, ale ne všechny, základní zdroje tím, že na každý zdroj umístí IX zámky. Povolte souběžné IS zámky na nejvyšší úrovni. Například zámek SIX tabulky umístí SIX zámek na tabulku (což umožňuje současné IS zámky) a IX zámek na aktuálně upravené stránce (X zámek na upraveném řádku). Zatímco každý zdroj může mít po určitou dobu pouze jeden zámek SIX, aby zabránil dalším transakcím v aktualizaci zdroje, jiné transakce mohou číst podkladové zdroje v hierarchii získáváním IS zámků na úrovni tabulky.
Exkluzivní zámek: Pouze program, který provádí zamykací operaci, jej může použít, a žádné jiné operace na něm nebudou přijaty. Když spustíte příkaz k aktualizaci dat, SQL Server automaticky použije exkluzivní zámek. Když na objektu existují jiné zámky, nelze k němu přidat exkluzivní zámek.
Sdílený zámek: Zdroj zamčený sdíleným zámkem může být přečten ostatními uživateli, ale ostatní uživatelé jej nemohou upravovat.
Aktualizační zámek: Když je SQL Server připraven aktualizovat data, nejprve uzamkne datový objekt, aby data nemohla být upravována, ale mohla být přečtena. Když SQL Server zjistí, že chce aktualizovat data, automaticky nahradí aktualizační zámek exkluzivním zámkem a nemůže k němu přidat aktualizační zámek, pokud na objektu existují jiné zámky.

2 . Z pohledu programátora: je rozdělen na optimistický zámek a pesimistický zámek.
Optimism Lock: Zcela spoléhá na databázi při řízení práce zámku.
Pesimistické zámky: Programátoři sami spravují správu zámků na data nebo objekty.
MS - SQLSERVER používá zámky k implementaci pesimistického řízení souběžnosti mezi více uživateli, kteří současně provádějí úpravy databáze

3. Velikost částic zámku
Granularita zámku je velikost blokovaného cíle, malá granularita blokování je vysoká souběžnost, ale režijní náklady jsou velké a velká granularita blokování je nízká souběžnost, ale režijní režie je malá
SQL Server podporuje uzamčení granularity pro řádky, stránky, klíče, rozsahy klíčů, indexy, tabulky nebo databáze
Popis zdroje
Identifikátor řádku RID. Používá se k uzamčení řady v stole jednotlivě.
Klíčové řádky v indexu jsou uzamčeny. Používá se k ochraně rozsahu klíčů v serializovatelných transakcích.
8 kilobajtů (KB) datových stránek nebo indexových stránek.
Rozšířený disk Sada osmi sousedních datových stránek nebo indexových stránek.
Tabulka Celá tabulka včetně všech dat a indexů.
DB databáze.
4. Délka doby uzamčení
Délka držení zámku je doba potřebná k ochraně zdroje na požadované úrovni.
Doba držení sdíleného zámku používaného k ochraně čtení závisí na úrovni izolace transakcí. Při výchozí úrovni izolace transakce v READ COMMITTED je sdílený zámek řízen pouze po dobu trvání čtené stránky. Při skenu se zámek neotevře, dokud není zajištěn na další stránce ve skenu. Pokud zadáte výzvu HOLDLOCK nebo nastavíte úroveň izolace transakce na REPEATABLE READ nebo SERIALIZABLE, zámek se uvolní až po skončení transakce.
V závislosti na nastavení možnosti souběžnosti kurzoru může kurzor získat scroll lock v režimu sdílení, aby ochránil extrakt. Když je potřeba zámek svitku, zámek se uvolní až při dalším vyjmutí nebo uzavření kurzoru, podle toho, co nastane dříve. Pokud však specifikujete HOLDLOCK, scroll lock se uvolní až na konci transace.
Exkluzivní zámek používaný k ochraně aktualizace nebude uvolněn až do konce transakce.
Pokud se spojení pokusí získat zámek, který je v konfliktu se zámkem ovládaným jiným spojením, spojení, které se snaží zámek získat, bude zablokováno až dosud:
Konfliktní zámek je uvolněn a spojení získá požadovaný zámek.
Vypršel časový limit připojení. Ve výchozím nastavení neexistuje časový limit, ale některé aplikace nastavují časové limity, aby zabránily neomezenému čekání

Pět úprav zámků v SQL Serveru
1 Řešení patových situací a nastavení priorit patových situací
Patová situace je nekonečné čekání způsobené tím, že více uživatelů žádá o různé bloky, protože žadatel má část blokovacího práva a čeká na částečné blokování vlastněné jinými uživateli
Můžete použít DEADLOCK_PRIORITY SET k ovládání, jak relace reaguje v případě zablokování. Pokud oba procesy data uzamknou a každý proces nemůže uvolnit svůj vlastní zámek, dokud druhý proces neuvolní svůj vlastní zámek, dojde k situaci mrtvého bloku.

2 Řešit timeouty a nastavit délku timeoutu locku.
@@LOCK_TIMEOUT Vrátí aktuální nastavení timeoutu pro aktuální relaci v milisekundách
Nastavení SET LOCK_TIMEOUT umožňuje aplikaci nastavit maximální dobu, po kterou příkaz čeká na blokaci zdroje. Když je čekací doba příkazu delší než nastavení LOCK_TIMEOUT, systém automaticky zruší blokovací příkaz a vrátí aplikaci chybovou zprávu 1222, že doba vypršení lhůty pro žádost o uzamčení byla překročena

příklad
V následujícím příkladu je doba vypršení zámku nastavena na 1 800 milisekund.
NASTAVTE LOCK_TIMEOUT1800

3) Nastavte úroveň izolace transakcí.

4) Používejte náznaky zámku na úrovni tabulky pro příkazy SELECT, INSERT, UPDATE a DELETE.

5) Konfigurovat granularitu uzamčení indexu
Můžete použít sp_indexoption systémové uložené procedury k nastavení granularity zámků pro indexování

6. Zobrazit informace o zámku

1 Provést EXEC SP_LOCK nahlásit informace o zámku
2 Stiskněte Ctrl + 2 v analyzátoru dotazů pro zobrazení informací o zámku

7. Opatření k použití

Jak se vyhnout patovým situacím
1. Při používání transakcí se snažte zkrátit logický proces zpracování transakcí a předčasně je odesílat nebo zrušovat.
2 Nastavte parametr zablokování na rozumný rozsah, například: 3 minuty - 10 minut; Po uplynutí času je operace automaticky opuštěna, aby se zabránilo zaseknutí procesu;
3. Optimalizovat program, zkontrolovat a vyhnout se jevu zablokování;
4. Pečlivě otestovat všechny skripty a SP před přesnou verzí.
5 Všechny SP musí mít zvládání chyb (přes @error)
6 Neměňte výchozí úroveň transakcí SQL SERVER. Nucené zamykání se nedoporučuje

Vyřešit problém Jak zamknout databázi řádkových tabulek

8. Několik otázek ohledně zámků

1 Jak zamknout řadu stolu
NASTAVIT ÚROVEŇ TRANSACTIONISOLATION READUNCOMMITTED
VYBERTE *Z tabulky ROWLOCK, kde id = 1

2 Uzamknout tabulku v databázi
VYBERTE *Z TABULKY WITH( HOLDLOCK )

Příkaz k zámku:
sybase:
aktualizace tabulky col1 = sloupec1, kde 1 = 0 ;
MSSQL:
Vyberte sloupec 1z tabulky (tablockx), kde 1= 0 ;
oracle:
STŮL S ZÁMKEM STOLU V EXKLUZIVNÍM REŽIMU ;
Po zamčení ho nikdo jiný nemůže ovládat, dokud ho zamčený uživatel neodemkne, a pak je odemčen pomocí commit nebo rollback

Několik příkladů vám pomůže prohloubit váš dojem
Nastavte tabulku1(A,B,C)
A B C
A1 B1 C1
A2 B2 C2
A3 B3 C3

1) Exkluzivní zámek
Vytvořte dvě nová spojení
Proveďte následující příkaz v prvním spojení
Start tran
Aktualizace tabulky1
set A= ' aa '
kde B= ' b2 '
čekej na zpoždění' 00:00:30' -- počkej 30 sekund
commit tran
Proveďte následující příkaz ve druhém spojení
Start tran
Vyberte *z tabulky1
kde B= ' b2 '
commit tran

Pokud jsou výše uvedené dva příkazy vykonány současně, dotaz výběru musí počkat na dokončení aktualizace, tedy počkat 30 sekund

2) Sdílený zámek
Proveďte následující příkaz v prvním spojení
Start tran
Vyberte *z tabulky1 Holdlock - Holdlock je uměle přidán k zámku
kde B= ' b2 '
čekej na zpoždění' 00:00:30' -- počkej 30 sekund
commit tran

Proveďte následující příkaz ve druhém spojení
Start tran
vyberte A,C z tabulky 1
kde B= ' b2 '
Aktualizace tabulky1
set A= ' aa '
kde B= ' b2 '
commit tran

Pokud jsou výše uvedené dva příkazy vykonány současně, může být vykonán select dotaz v druhém spojení
Aktualizace musí počkat na první transakci, aby uvolnila sdílený zámek a převedla jej na exkluzivní zámek, než může být vykonána, tedy počkat 30 sekund

3) Patová situace
Přidán tabulk2(D,E)
D E
d1 e1
d2 e2
Proveďte následující příkaz v prvním spojení
Start tran
Aktualizace tabulky1
set A= ' aa '
kde B= ' b2 '
čekat na zpoždění 00:00:30'
Aktualizace tabulky2
set D= ' d5'
kde E= ' e1 '
commit tran

Proveďte následující příkaz ve druhém spojení
Start tran
Aktualizace tabulky2
set D= ' d5'
kde E= ' e1 '
čekej na zpoždění 00:00:10'
Aktualizace tabulky1
set A= ' aa '
kde B= ' b2 '
commit tran

Současně systém detekuje zablokování a proces přeruší

Doplnění:
Nápovědy k uzamykaní na úrovni tabulky podporované SQL Server 2000

HOLDLOCK drží sdílený zámek do dokončení celé transakce a měl by být uvolněn jakmile není uzamčený objekt potřeba, což odpovídá úrovni izolace transakce SERIALIZABLE
Příkaz NOLOCK se vykoná bez vydání sdíleného zámku, což umožňuje nečisté čtení, což odpovídá úrovni READ UNCOMMITTED transaction isolation
PAGLOCK používá více zámků stránek, kde se používá jeden zámek tabulky
READPAST umožňuje SQL serveru přeskočit všechny zamčené řádky a provádět transakce, a pro úrovně izolace transakcí READ UNCOMMITTED přeskočí pouze RID zámky, nikoli zámky stránek, zón a tabulek
ROWLOCK vyžaduje použití rowlocků
TABLOCKX vynucuje použití exkluzivního zámku na úrovni tabulky, který zabraňuje jakékoli jiné transakci v používání tabulky během transakce
UPLOCK vyžaduje použití aktualizací při čtení tabulky bez sdíleného zámku

Zámek aplikace:
Aplikační zámek je zámek generovaný klientským kódem, nikoli zámek generovaný samotným SQL Serverem

Dva procesy pro řešení aplikačních zámků
sp_getapplock Aplikace Lock
sp_releaseapplock Odemkněte aplikační zdroje

Poznámka: Rozdíl mezi uzamčením tabulky v databázi

SELECT *FROM table WITH( HOLDLOCK ) Jiné transakce mohou tabulku číst, ale nemohou ji aktualizovat a mazat
VYBERTE *Z TABULKY S(TABLOCKX) Ostatní transakce nemohou tabulku číst, aktualizovat ani mazat





Předchozí:Nebyl žádný cíl, který by poslouchal http://localhost:111/xxx.svc ten c...
Další:SQL zámky NOLOCK, HOLDLOCK, UPDLOCK, TABLOCK, TABLOCKX
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com