Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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: