Řízení optimistické souběžnosti a transakce
PLATÍ PRO: NoSQL
Databázové transakce poskytují bezpečný a předvídatelný programovací model pro zpracování souběžných změn dat. Tradiční relační databáze, jako SQL Server, umožňují psát obchodní logiku pomocí uložených procedur nebo triggerů a odesílat ji na server k provedení přímo v databázovém stroji. U tradičních relačních databází musíte pracovat se dvěma různými programovacími jazyky ( ne transakčními) aplikačními programovacími jazyky, jako je JavaScript, Python, C#, Java atd. a transakční programovací jazyk (například T-SQL), který je nativně spouštěný databází.
Databázový stroj ve službě Azure Cosmos DB podporuje úplné transakce kompatibilní s acid (Atomicity, Consistency, Isolation, Durability) s izolací snímků. Všechny databázové operace v rámci oboru logického oddílu kontejneru se provádějí transakcí v rámci databázového stroje hostovaného replikou oddílu. Tyto operace zahrnují operace zápisu (aktualizace jedné nebo více položek v rámci logického oddílu) i operace čtení. Následující tabulka ukazuje různé operace a typy transakcí:
Operace | Typ operace | Transakce s jednou nebo více položkami |
---|---|---|
Vložit (bez triggeru před/po) | Zápis | Transakce s jednou položkou |
Vložení (s aktivační událostí před a po) | Zápis a čtení | Transakce s více položkami |
Nahradit (bez předběžného a následného triggeru) | Zápis | Transakce s jednou položkou |
Nahradit (s triggerem před a po) | Zápis a čtení | Transakce s více položkami |
Upsert (bez triggeru před/po) | Zápis | Transakce s jednou položkou |
Upsert (s aktivační událostí před a po) | Zápis a čtení | Transakce s více položkami |
Odstranění (bez předběžného nebo následného triggeru) | Zápis | Transakce s jednou položkou |
Odstranění (s aktivační událostí před a po) | Zápis a čtení | Transakce s více položkami |
Spustit uloženou proceduru | Zápis a čtení | Transakce s více položkami |
Systém inicioval spuštění procedury sloučení | Zápis | Transakce s více položkami |
Systém inicioval spuštění odstranění položek na základě hodnoty TTL (vypršení platnosti) položky. | Zápis | Transakce s více položkami |
Čtení | Čtení | Transakce s jednou položkou |
Kanál změn | Read | Transakce s více položkami |
Stránkované čtení | Read | Transakce s více položkami |
Stránkovaný dotaz | Read | Transakce s více položkami |
Spuštění funkce definované uživatelem jako součásti stránkovaného dotazu | Read | Transakce s více položkami |
Transakce s více položkami
Azure Cosmos DB umožňuje psát uložené procedury, předběžné a následné triggery, uživatelem definované funkce (UDF) a slučovat procedury v JavaScriptu. Azure Cosmos DB nativně podporuje spouštění JavaScriptu ve svém databázovém stroji. V kontejneru můžete zaregistrovat uložené procedury, předběžné a následné triggery, uživatelem definované funkce (UDF) a procedury sloučení a později je transakčním spuštěním v databázovém stroji Azure Cosmos DB. Psaní aplikační logiky v JavaScriptu umožňuje přirozené vyjádření toku řízení, určení rozsahu proměnných, přiřazení a integraci primitiv zpracování výjimek v rámci databázových transakcí přímo v jazyce JavaScript.
Uložené procedury, triggery, funkce definované uživatelem a slučovací procedury založené na JavaScriptu jsou zabalené do okolí transakce ACID s izolací snímků napříč všemi položkami v rámci logického oddílu. Pokud javascriptový program vyvolá výjimku, během jeho provádění se celá transakce přeruší a vrátí zpět. Výsledný programovací model je jednoduchý, ale výkonný. Vývojáři v JavaScriptu získají odolný programovací model a přitom stále používají známé jazykové konstrukty a primitiva knihoven.
Možnost spouštět JavaScript přímo v databázovém stroji zajišťuje výkon a transakční provádění databázových operací s položkami kontejneru. Vzhledem k tomu, že databázový stroj Azure Cosmos DB nativně podporuje JSON a JavaScript, neexistuje žádná neshoda impedance mezi systémy typů aplikace a databáze.
Řízení optimistické souběžnosti
Optimistické řízení souběžnosti umožňuje zabránit ztrátě aktualizací a odstranění. Souběžné konfliktní operace podléhají pravidelnému pesimistickému uzamčení databázového stroje hostovaného logickým oddílem, který položku vlastní. Když se dvě souběžné operace pokusí aktualizovat nejnovější verzi položky v rámci logického oddílu, jedna z nich vyhraje a druhá selže. Pokud však jedna nebo dvě operace, které se pokusily souběžně aktualizovat stejnou položku, dříve načetly starší hodnotu položky, databáze neví, jestli hodnota, kterou dříve načetla některá nebo obě konfliktní operace, byla skutečně nejnovější hodnotou položky. Naštěstí se tato situace dá zjistit pomocí optimistického řízení souběžnosti (OCC) před tím, než tyto dvě operace vstoupí do hranice transakce v databázovém stroji. OCC chrání vaše data před náhodným přepsáním změn provedených jinými uživateli. Brání také ostatním v tom, aby omylem přepsaly vaše vlastní změny.
Implementace optimistického řízení souběžnosti pomocí hlaviček protokolu ETag a HTTP
Každá položka uložená v kontejneru Azure Cosmos DB má systémem definovanou _etag
vlastnost. Hodnota _etag
je automaticky generována a aktualizována serverem při každé aktualizaci položky. _etag
lze použít s hlavičkou požadavku dodanou if-match
klientem, aby server mohl rozhodnout, zda lze položku podmíněně aktualizovat. Hodnota hlavičky if-match
odpovídá hodnotě _etag
na serveru, položka se pak aktualizuje. Pokud už hodnota if-match
hlavičky požadavku není aktuální, server operaci odmítne se zprávou odpovědi HTTP 412 Kvůli chybě předběžné podmínky. Klient pak může položku znovu načíst, aby získal aktuální verzi položky na serveru, nebo přepsat verzi položky na serveru vlastní _etag
hodnotou položky. Kromě toho je možné použít s hlavičkou if-none-match
k určení, _etag
jestli je potřeba znovu načíst prostředek.
Hodnota položky se _etag
změní při každé aktualizaci položky. Operace nahrazení položky if-match
musí být explicitně vyjádřeny jako součást možností žádosti. Příklad najdete v ukázkovém kódu na GitHubu. _etag
hodnoty se implicitně kontrolují pro všechny zapsané položky, na které se uložená procedura dotkne. Pokud je zjištěn jakýkoli konflikt, uložená procedura vrátí transakci zpět a vyvolá výjimku. S touto metodou jsou buď všechny zápisy v rámci uložené procedury použity atomicky. Jedná se o signál pro aplikaci, aby znovu aplikala aktualizace a zopakování původního požadavku klienta.
Optimistické řízení souběžnosti a globální distribuce
Souběžné aktualizace položky podléhají OCC vrstvě komunikačního protokolu služby Azure Cosmos DB. U účtů Azure Cosmos DB nakonfigurovaných pro zápisy do jedné oblasti Azure Cosmos DB zajišťuje, aby verze položky, kterou aktualizujete (nebo odstraňujete), na straně klienta byla stejná jako verze položky v kontejneru Azure Cosmos DB. Tím se zajistí, že vaše zápisy budou chráněny před náhodným přepsáním jinými zápisy a naopak. V prostředí s více uživateli vás ovládací prvek optimistické souběžnosti chrání před náhodným odstraněním nebo aktualizací nesprávné verze položky. Položky jsou proto chráněny před nechráněným "ztraceným updatem" nebo "ztraceným odstraněním".
V účtu Služby Azure Cosmos DB s nakonfigurovanými zápisy do více oblastí je možné data potvrdit nezávisle do sekundárních oblastí, pokud se shodují _etag
s daty v místní oblasti. Jakmile se nová data potvrdí místně v sekundární oblasti, sloučí se v centru nebo primární oblasti. Pokud zásada řešení konfliktů sloučí nová data do oblasti centra, budou se tato data globálně replikovat s novou _etag
. Pokud zásady řešení konfliktů nová data zamítnou, sekundární oblast se vrátí zpět na původní data a _etag
.
Další kroky
Další informace o databázových transakcích a řízení optimistické souběžnosti najdete v následujících článcích: