Sdílet prostřednictvím


Transakce a řízení optimistické souběžnosti

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 triggerů a pak ji odeslat na server pro spuštění 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: netransakčním programovacím jazykem, jako je JavaScript, Python, C# nebo Java; a transakční programovací jazyk, jako je T-SQL, který nativně spouští databáze.

Databázový stroj ve službě Azure Cosmos DB podporuje plně ACID (atomicita, konzistence, izolace, trvalost) kompatibilní transakce s podporou izolace 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 uvádí různé operace a typy transakcí:

Operace Typ operace Transakce s jednou nebo více položkami
Vložit (bez aktivační události před/po) Psát 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
Vyměnit (bez spuštění události před/po) Psát 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) Psát Transakce s jednou položkou
Upsert (s aktivační událostí před/po) Zápis a čtení Transakce s více položkami
Smazat (bez aktivační události před/po) Psát 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 Psát Transakce s více položkami
Systém zahájil odstranění položek podle vypršení platnosti (TTL) položky. Psát Transakce s více položkami
Přečíst Přečíst Transakce s jednou položkou
Změna kanálu Přečíst Transakce s více položkami
Stránkované čtení Přečíst Transakce s více položkami
Stránkovaný dotaz Přečíst Transakce s více položkami
Proveďte UDF v rámci stránkovaného dotazu Přečíst Transakce s více položkami

Transakce s více položkami

Azure Cosmos DB umožňuje psát uložené procedury, triggery a uživatelem definované funkce 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 ve prostředí transakce ACID s izolací snímku napříč všemi objekty v rámci logického oddílu. Pokud během provádění program JavaScript 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, neexistuje žádná neshoda impedance mezi systémy typů aplikace a databáze.

Řízení optimistické souběžnosti

Optimistické řízení souběžnosti (OCC) 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, nebo obě konfliktní operace skutečně nejnovější hodnotou položky.

Tuto situaci lze naštěstí zjistit pomocí OCC, 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 provedených jinými uživateli. 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 _etag je serverem automaticky generována a aktualizována pokaždé, když je položka aktualizována. _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. Pokud 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 opětovně načíst, aby získal aktuální verzi položky na serveru, nebo přepsat verzi položky na serveru vlastní hodnotou _etag pro položku. Kromě toho lze _etag použít s hlavičkou if-none-match k určení, jestli je potřeba znovu načíst prostředek.

Hodnota položky _etag se změní při každé aktualizaci položky. Pro operaci nahrazení položky if-match musí být explicitně vyjádřeno jako součást voleb žádosti. Příklad najdete v ukázkovém kódu na GitHubu. Hodnoty _etag jsou implicitně kontrolovány pro všechny zapsané položky ovlivněné uloženou procedurou. Pokud dojde ke konfliktu, uložená procedura vrátí zpět transakci 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í vrstvě komunikačního protokolu OCC ve službě Azure Cosmos DB. Pro účty Azure Cosmos DB nakonfigurované pro zápisy do jedné oblasti zajišťuje Azure Cosmos DB, že verze položky, kterou aktualizujete (nebo odstraňujete), je 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 vás optimistické řízení souběžnosti chrání 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 známými problémy, jako je ztráta aktualizace nebo odstranění.

V účtu služby Azure Cosmos DB nakonfigurovaném pro zápisy ve více oblastech lze data nezávisle potvrdit do sekundárních oblastí, pokud se jejich _etag shoduje 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 centrální oblasti, tato data se budou replikovat globálně s novou _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ém řízení souběžnosti: