Ří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 je SQL Server, umožňují psát obchodní logiku pomocí uložených procedur a/nebo triggerů, odesílat ji na server pro spuštění přímo v databázovém stroji. U tradičních relačních databází je nutné pracovat se dvěma různými programovacími jazyky programovacího jazyka (neaktorálního) aplikačního jazyka, jako je JavaScript, Python, C#, Java atd. a transakčního programovacího jazyka (například T-SQL), který je nativně spuš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 databázovém stroji hostovaném replikou oddílu. Mezi tyto operace patří zápis (aktualizace jedné nebo více položek v rámci logického oddílu) i operace čtení. Následující tabulka znázorňuje různé operace a typy transakcí:
Operace | Typ operace | Transakce s jednou nebo více položkami |
---|---|---|
Vložení (bez aktivační události před/po) | Write | Transakce s jednou položkou |
Vložení (s aktivační událostí před/po) | Zápis a čtení | Transakce s více položkami |
Nahrazení (bez aktivační události před/po) | Write | Transakce s jednou položkou |
Nahrazení (pomocí aktivační události před/po) | Zápis a čtení | Transakce s více položkami |
Upsert (bez aktivační události před/po) | Write | Transakce s jednou položkou |
Upsert (s aktivační událostí před/po) | Zápis a čtení | Transakce s více položkami |
Odstranění (bez aktivační události před/po) | Write | Transakce s jednou položkou |
Odstranění (s aktivační událostí před/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 |
Spuštění procedury sloučení iniciované systémem | Write | Transakce s více položkami |
Spuštění odstraňování položek iniciované systémem na základě vypršení platnosti (TTL) položky | Write | Transakce s více položkami |
Přečíst | Přečíst | Transakce s jednou položkou |
Kanál změn | Čteno | Transakce s více položkami |
Stránkované čtení | Čteno | Transakce s více položkami |
Stránkovaný dotaz | Čteno | Transakce s více položkami |
Spuštění UDF jako součásti stránkovaného dotazu | Čteno | Transakce s více položkami |
Transakce s více položkami
Azure Cosmos DB umožňuje psát uložené procedury, triggery před a po spuštění, uživatelem definované funkce (UDF) a sloučit procedury v JavaScriptu. Azure Cosmos DB nativně podporuje spouštění JavaScriptu v rámci svého databázového stroje. Uložené procedury, triggery před a po spuštění, uživatelem definované funkce (UDF) a procedury sloučení můžete zaregistrovat v kontejneru a později je spustit transakčním procesem v databázovém stroji Azure Cosmos DB. Psaní logiky aplikace v JavaScriptu umožňuje přirozený výraz toku řízení, rozsahu proměnných, přiřazení a integrace primitiv zpracování výjimek v databázových transakcích přímo v jazyce JavaScript.
Uložené procedury, triggery, funkce definované uživatelem a slučovací procedury založené na JavaScriptu jsou zabaleny do okolí transakce ACID s izolací snímků napříč všemi položkami v rámci logického oddílu. Pokud javascriptový program během provádění vyvolá výjimku, celá transakce je přerušena a vrácena zpět. Výsledný programovací model je jednoduchý, ale výkonný. Vývojáři JavaScriptu získají trvalý programovací model, zatímco stále používají známé jazykové konstrukty a primitivy knihoven.
Schopnost spouštět JavaScript přímo v databázovém stroji poskytuje 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, mezi systémy typů aplikace a databází se navíc neshoduje žádná impedance.
Ří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, jeden z nich vyhraje a druhá selže. Pokud se ale jedna nebo dvě operace pokoušející se současně aktualizovat stejnou položku, přečetla starší hodnotu položky, databáze neví, jestli byla dříve přečtená hodnota buď konfliktní operace, nejnovější hodnotou položky. Naštěstí lze tuto situaci zjistit pomocí optimistického řízení souběžnosti (OCC) před tím, než necháte dvě operace vstoupit do hranice transakce uvnitř databázového stroje. OCC chrání vaše data před náhodným přepsáním změn, které provedli jiní uživatelé. Zabrání také tomu, aby ostatní omylem přepsali vaše vlastní změny.
Implementace optimistického řízení souběžnosti pomocí hlaviček ETag a HTTP
Každá položka uložená v kontejneru Azure Cosmos DB má vlastnost definovanou _etag
systémem. Hodnota se _etag
automaticky vygeneruje a aktualizuje 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, jestli lze položku podmíněně aktualizovat. Hodnota hlavičky if-match
odpovídá hodnotě _etag
na serveru, položka se pak aktualizuje. Pokud hodnota if-match
hlavičky požadavku již není aktuální, server odmítne operaci se zprávou http 412 o selhání předběžné podmínky. Klient pak může položku znovu načíst, aby získala 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 _etag
se změní při každé aktualizaci položky. Pro operace if-match
nahrazení položky musí být explicitně vyjádřen jako součást možností žádosti. Příklad najdete v ukázkovém kódu na GitHubu. _etag
hodnoty jsou implicitně kontrolovány pro všechny zapsané položky ovlivněné uloženou procedurou. Pokud se zjistí nějaký konflikt, uložená procedura vrátí transakce zpět a vyvolá výjimku. Při použití této metody se všechny nebo žádné zápisy v rámci uložené procedury použijí atomicky. Toto je signál aplikace k opětovnému použití aktualizací a opakování původní žádosti klienta.
Optimistická řízení souběžnosti a globální distribuce
Souběžné aktualizace položky podléhají protokolu OCC vrstvě komunikačního protokolu služby Azure Cosmos DB. Pro účty Azure Cosmos DB nakonfigurované pro zápisy do jedné oblasti zajišťuje Azure Cosmos DB, aby verze položky, kterou aktualizujete (nebo odstraňujete), byla stejná jako verze položky v kontejneru Azure Cosmos DB. Tím zajistíte, že vaše zápisy budou chráněny před náhodným přepsáním zápisy ostatních a naopak. V prostředí s více uživateli chrání ovládací prvek optimistické souběžnosti před náhodným odstraněním nebo aktualizací nesprávné verze položky. V takovém případě jsou položky chráněny před neznámými problémy se ztrátou aktualizace nebo ztráty odstranění.
V účtu služby Azure Cosmos DB nakonfigurovaného pro zápisy do více oblastí je možné data potvrdit nezávisle do sekundárních oblastí, pokud se shoduje _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ásady řešení konfliktů sloučí nová data do oblasti centra, budou se tato data replikovat globálně s novým _etag
. Pokud zásada řešení konfliktů odmítne nová data, sekundární oblast se vrátí zpět k původním datům a _etag
.
Další kroky
Další informace o databázových transakcích a optimistické kontrole souběžnosti najdete v následujících článcích: