Popis souběžnosti

Dokončeno

Základní funkcí víceuživatelných databází je souběžnost. Souběžnost používá zamykání a blokování, aby data zůstala konzistentní, i když mnoho uživatelů současně aktualizuje a čte data. Například kvůli nákladům na dopravu mají všechny naše produkty zvýšení ceny 5 USD. Kvůli směnným kurzům mají všechny produkty současně snížení ceny o 3%. Pokud k těmto aktualizacím dojde přesně ve stejnou dobu, konečná cena bude proměnná a pravděpodobně dojde k mnoha chybám. Pomocí uzamčení můžete zajistit, aby se jedna aktualizace dokončila před zahájením druhé aktualizace.

Konkurentnost se vyskytuje na úrovni transakce. Transakce zápisu může blokovat aktualizaci jiných transakcí a dokonce čtení stejných dat. Stejně tak může transakce čtení blokovat jiné čtenáře nebo dokonce některé zapisovatele. Z tohoto důvodu je důležité vyhnout se zbytečně dlouhým transakcím nebo transakcím zahrnujícím nadměrné množství dat.

Existuje mnoho konkrétních úrovní izolace transakcí, které lze použít k definování způsobu, jakým databázový systém zpracovává více uživatelů. Pro účely tohoto modulu se podíváme na široké kategorie úrovní izolace, optimistické uzamykání a pesimistické uzamčení.

Poznámka:

Úplné podrobnosti o uzamykání transakcí nad rámec souběžnosti souvisí s výkonem, a to nejen v závislosti na kódu - i když dobrý kód funguje lépe. Další podrobnosti najdete v podrobné příručce k zamykání transakcí SQL Serveru a správy verzí řádků . Informace o blokování najdete také v dokumentaci k výkonu SQL Serveru.

Optimistická souběžnost

S optimistickým uzamykáním existuje předpoklad, že dojde k málo konfliktním aktualizacím. Na začátku transakce se zaznamená počáteční stav dat. Před potvrzením transakce se aktuální stav porovná s počátečním stavem. Pokud jsou stavy stejné, transakce je dokončena. Pokud se stavy liší, transakce se zruší.

Máte například tabulku obsahující prodejní objednávky za poslední roky. Tato data se aktualizují zřídka, ale sestavy se spouštějí často. Díky optimistickému zamykání se transakce navzájem nezablokují a systém běží efektivněji. V posledních letech se bohužel zjistily chyby a aktualizace, které je potřeba provést. Zatímco jedna transakce aktualizuje každý řádek, druhá transakce provádí drobnou úpravu jednoho řádku zároveň. Vzhledem k tomu, že stav dat byl změněn při spuštění počáteční transakce, celá transakce se vrátí zpět.

Pesimistické souběžnosti

S pesimistickým uzamykáním existuje předpoklad, že je současně prováděno mnoho aktualizací na datech. Pomocí zámků může probíhat současně pouze jedna aktualizace a při provádění aktualizací se zabrání čtení dat. To může zabránit velkým vrácením zpět, jak je vidět v předchozím příkladu, ale může způsobit zbytečné blokování dotazů.

Při rozhodování, jestli se má použít optimistická nebo pesimistická souběžnost, je důležité vzít v úvahu povahu dat a dotazy spuštěné na těchto datech, aby bylo zajištěno optimální výkon.

Izolace snímků

SQL Server má pět různých úrovní izolace, ale v tomto modulu se zaměříme jen na READ_COMMITTED_SNAPSHOT_OFF a READ_COMMITTED_SNAPSHOT_ON. READ_COMMITTED_SNAPSHOT_OFF je výchozí úroveň izolace pro SQL Server. READ_COMMITTED_SNAPSHOT_ON je výchozí úroveň izolace nastavena pro Azure SQL Database.

READ_COMMITTED_SNAPSHOT_OFF bude uchovávat zámky na ovlivněných řádcích až do konce transakce, pokud dotaz používá úroveň izolace transakce "Read Committed". I když může dojít k některým aktualizacím, například vytvoření nového řádku, zabráníte tak většině konfliktních změn v datech, která se čtou nebo aktualizují. To je pesimistická současnost.

READ_COMMITTED_SNAPSHOT_ON pořídí snímek dat. Aktualizace se pak na daném snímku provádějí, což umožňuje jiným připojením dotazovat se na původní data. Na konci transakce je aktuální stav dat porovnán se snímkem. Pokud jsou data stejná, transakce se potvrdí. Pokud se data liší, transakce se vrátí zpět.

Pokud chcete změnit úroveň izolace na READ_COMMITTED_SNAPSHOT_ON zadejte následující příkaz:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;

Pokud chcete změnit úroveň izolace na READ_COMMITTED_SNAPSHOT_OFF zadejte následující příkaz:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;

Pokud byla databáze změněna tak, aby zapnula potvrzený snímek pro čtení, všechny transakce, které používají výchozí úroveň izolace potvrzené čtení, budou používat optimistické uzamčení.

Poznámka:

Izolace snímků probíhá pouze u transakcí potvrzených pro čtení. Transakce, které používají jiné úrovně izolace, nejsou ovlivněny.