Uložené procedury, triggery a uživatelem definované funkce

PLATÍ PRO: NoSQL

Azure Cosmos DB poskytuje transakční spouštění JavaScriptu integrované do jazyka. Při použití rozhraní API pro NoSQL ve službě Azure Cosmos DB můžete psát uložené procedury, triggery a uživatelem definované funkce (UDF) v jazyce JavaScript. Vlastní logiku můžete psát v JavaScriptu, který se spouští v databázovém stroji. Triggery, uložené procedury a funkce definované uživatelem můžete vytvářet a spouštět pomocí Azure Portal, rozhraní API pro dotazy integrované v jazyce JavaScript ve službě Azure Cosmos DB nebo klientských sad SDK služby Azure Cosmos DB for NoSQL.

Výhody použití programování na straně serveru

Zápis uložených procedur, triggerů a uživatelem definovaných funkcí (UDF) v JavaScriptu umožňuje vytvářet bohaté aplikace a mají následující výhody:

  • Procedurální logika: JavaScript jako programovací jazyk vysoké úrovně, který poskytuje bohaté a známé rozhraní pro vyjádření obchodní logiky. S daty můžete provádět řadu složitých operací.

  • Atomické transakce: Databázové operace Azure Cosmos DB, které se provádějí v rámci jedné uložené procedury nebo triggeru, jsou atomické. Tato atomická funkce umožňuje aplikaci kombinovat související operace do jedné dávky, takže buď všechny operace proběhnou úspěšně, nebo žádná z nich.

  • Výkon: Data JSON se vnitřně mapují na systém typů jazyka JavaScript. Toto mapování umožňuje řadu optimalizací, jako je opožděná materializace dokumentů JSON ve fondu vyrovnávacích pamětí a jejich zpřístupnění na vyžádání pro spouštění kódu. S přesunem obchodní logiky do databáze jsou spojené další výkonnostní výhody, mezi které patří:

    • Dávkování: Operace, jako jsou vložení, můžete seskupit a odeslat je hromadně. Výrazně se sníží latence síťového provozu a režijní náklady na úložiště při vytváření samostatných transakcí.

    • Předkompilační: Uložené procedury, triggery a funkce definované uživatelem se implicitně předem kompilují do formátu bajtového kódu, aby se zabránilo nákladům na kompilaci v době každého vyvolání skriptu. Kvůli předběžné kompilaci je volání uložených procedur rychlé a má nízkou stopu.

    • Sekvenování: Někdy operace potřebují aktivační mechanismus, který může provést jednu nebo další aktualizaci dat. Kromě atomicity existují také výhody z hlediska výkonu při provádění na straně serveru.

  • Zapouzdření: Uložené procedury se dají použít k seskupení logiky na jednom místě. Zapouzdření přidává k datům abstraktní vrstvu, která umožňuje vyvíjet aplikace nezávisle na datech. Tato vrstva abstrakce je užitečná, když data nemají schéma a nemusíte spravovat přidávání další logiky přímo do aplikace. Abstrakce umožňuje udržovat data zabezpečená tím, že zefektivňuje přístup ze skriptů.

Tip

Uložené procedury jsou nejvhodnější pro operace, které jsou náročné na zápis a vyžadují transakci napříč hodnotou klíče oddílu. Při rozhodování o tom, jestli použít uložené procedury, optimalizujte zapouzdření maximálního možného množství zápisů. Obecně řečeno, uložené procedury nejsou nejúčinnějším prostředkem pro provádění velkého počtu operací čtení nebo dotazování, takže použití uložených procedur k dávce velkého počtu čtení pro vrácení klientovi nepřinese požadovanou výhodu. Pro zajištění nejlepšího výkonu by se tyto operace náročné na čtení měly provádět na straně klienta pomocí sady SDK služby Azure Cosmos DB.

Poznámka

Funkce JavaScriptu na straně serveru, včetně uložených procedur, triggerů a uživatelem definovaných funkcí, nepodporují import modulů.

Transakce

Transakce v typické databázi lze definovat jako posloupnost operací prováděných jako jedna logická jednotka práce. Každá transakce poskytuje záruky vlastností ACID. ACID je známá zkratka, která znamená: Atomicity, Consistency, Isolation, and Durability.

  • Nedělitelnost zaručuje, že všechny operace prováděné uvnitř transakce jsou považovány za jednu jednotku a buď jsou potvrzeny všechny, nebo žádné z nich nejsou.

  • Konzistence zajišťuje, že data jsou vždy v platném stavu napříč transakcemi.

  • Izolace zaručuje, že žádné dvě transakce vzájemně neruší – mnoho komerčních systémů poskytuje více úrovní izolace, které lze použít na základě potřeb aplikace.

  • Stálost zajišťuje, že všechny změny potvrzené v databázi budou vždy přítomny.

Ve službě Azure Cosmos DB je modul runtime JavaScript hostovaný v databázovém stroji. Proto se požadavky provedené v rámci uložených procedur a triggery spouštějí ve stejném oboru jako relace databáze. Tato funkce umožňuje službě Azure Cosmos DB zaručit vlastnosti ACID pro všechny operace, které jsou součástí uložené procedury nebo triggeru. Příklady najdete v článku o implementaci transakcí .

Tip

Pokud chcete ve službě Azure Cosmos DB for NoSQL podporovat transakce, můžete také implementovat transakční dávku pomocí preferované klientské sady SDK. Další informace najdete v tématu Transakční dávkové operace ve službě Azure Cosmos DB for NoSQL.

Rozsah transakce

Uložené procedury jsou přidružené ke kontejneru Azure Cosmos DB a provádění uložených procedur je omezené na klíč logického oddílu. Uložené procedury musí během provádění obsahovat hodnotu klíče logického oddílu, která definuje logický oddíl pro obor transakce. Další informace najdete v článku Dělení služby Azure Cosmos DB .

Potvrzení a vrácení zpět

Transakce jsou nativně integrované do programovacího modelu Azure Cosmos DB v JavaScriptu. V rámci funkce JavaScriptu se všechny operace automaticky zabalí do jedné transakce. Pokud se javascriptová logika v uložené proceduře dokončí bez výjimek, všechny operace v rámci transakce se potvrdí do databáze. Příkazy jako BEGIN TRANSACTION a COMMIT TRANSACTION (známé pro relační databáze) jsou implicitní ve službě Azure Cosmos DB. Pokud skript obsahuje výjimky, modul runtime JavaScriptu služby Azure Cosmos DB vrátí zpět celou transakci. Proto je vyvolání výjimky v podstatě ekvivalentní k výjimce ve službě ROLLBACK TRANSACTION Azure Cosmos DB.

Konzistence dat

Uložené procedury a triggery se vždy spouští na primární replice kontejneru Azure Cosmos DB. Tato funkce zajišťuje, že čtení z uložených procedur nabízí silnou konzistenci. Dotazy využívající uživatelem definované funkce je možné spouštět na primární nebo jakékoli sekundární replice. Uložené procedury a triggery jsou určené k podpoře transakčních zápisů – logika jen pro čtení je zatím nejlepší implementovat jako logika na straně aplikace a dotazy pomocí sad SDK služby Azure Cosmos DB for NoSQL, které vám pomůžou saturovat propustnost databáze.

Tip

Dotazy spuštěné v rámci uložené procedury nebo triggeru nemusí vidět změny položek provedených stejnou transakcí skriptu. Tento příkaz se vztahuje jak na dotazy SQL, jako getContent().getCollection.queryDocuments()je , tak i na integrované dotazy jazyka, jako getContext().getCollection().filter()je .

Omezené spouštění

Všechny operace Služby Azure Cosmos DB musí být dokončeny v zadané době časového limitu. Uložené procedury mají časový limit 5 sekund. Toto omezení platí pro funkce JavaScriptu – uložené procedury, triggery a uživatelem definované funkce. Pokud se operace nedokončila v daném časovém limitu, transakce se vrátí zpět.

Můžete buď zajistit, aby se funkce JavaScriptu dokončily ve stanoveném časovém limitu, nebo implementovat model založený na pokračování pro dávkové/obnovení provádění. Aby se zjednodušil vývoj uložených procedur a triggerů pro zpracování časových limitů, všechny funkce v kontejneru Azure Cosmos DB (například vytváření, čtení, aktualizace a odstraňování položek) vrací logickou hodnotu, která představuje, jestli se tato operace dokončí. Pokud je tato hodnota false, znamená to, že procedura musí zabalit provádění, protože skript spotřebovává více času nebo zřízenou propustnost, než je nakonfigurovaná hodnota. Operace zařazené do fronty před první nepřijatou operací úložiště jsou zaručeny, že se dokončí, pokud se uložená procedura dokončí včas a nezasadí žádné další požadavky do fronty. Operace by proto měly být zařazeny do fronty jeden po druhém pomocí konvence zpětného volání JavaScriptu ke správě toku řízení skriptu. Vzhledem k tomu, že se skripty spouštějí v prostředí na straně serveru, jsou přísně řízeny. Skripty, které opakovaně porušují hranice provádění, mohou být označeny jako neaktivní a nelze je spustit a měly by se znovu vytvořit, aby byly dodrženy hranice provádění.

Funkce JavaScriptu také podléhají zřízené kapacitě propustnosti. Funkce JavaScriptu můžou během krátké doby potenciálně skončit s využitím velkého počtu jednotek žádostí a při dosažení limitu zřízené kapacity propustnosti můžou být rychlostně omezené. Je důležité si uvědomit, že skripty spotřebovávají kromě propustnosti strávené prováděním databázových operací další propustnost, i když tyto databázové operace jsou o něco levnější než provádění stejných operací z klienta.

Aktivační události

Azure Cosmos DB podporuje dva typy triggerů:

Triggery před akcí

Azure Cosmos DB poskytuje triggery, které je možné vyvolat provedením operace s položkou Azure Cosmos DB. Můžete například určit trigger před akcí vytvoření položky. V tomto případě se trigger před akcí spustí před vytvořením položky. Triggery před akcí nesmí mít žádné vstupní parametry. V případě potřeby je možné k aktualizaci těla dokumentu z původního požadavku použít objekt požadavku. Po zaregistrování triggerů můžou uživatelé určit operace, se kterými se můžou spouštět. Pokud se vytvoří trigger s operací TriggerOperation.Create, znamená to, že tento trigger nebude možné použít v operaci nahrazení. Příklady najdete v článku Jak psát triggery .

Triggery po akci

Podobně jako triggery před triggery jsou triggery post také přidružené k operaci s položkou služby Azure Cosmos DB a nevyžadují žádné vstupní parametry. Spustí se po dokončení operace a mají přístup ke zprávě odpovědi, která se odešle klientovi. Příklady najdete v článku Jak psát triggery .

Poznámka

Registrované triggery se nespouštějí automaticky, když dojde k jejich odpovídajícím operacím (vytvoření, odstranění, nahrazení nebo aktualizace). Při provádění těchto operací se musí explicitně zavolat. Další informace najdete v článku o tom, jak spouštět triggery .

Uživatelem definované funkce

Uživatelem definované funkce (UDF) slouží k rozšíření syntaxe rozhraní API pro dotazovací jazyk NoSQL a snadné implementaci vlastní obchodní logiky. Je možné je volat pouze v rámci dotazů. Funkce definované uživatelem nemají přístup k objektu kontextu a jsou určeny k použití jako výpočetní funkce pouze v JavaScriptu. Proto je možné uživatelem definované funkce spouštět na sekundárních replikách.

Rozhraní API pro dotazy integrované v jazyce JavaScriptu

Kromě vystavování dotazů pomocí syntaxe dotazů API for NoSQL vám sada SDK na straně serveru umožňuje provádět dotazy pomocí rozhraní JavaScriptu bez znalosti SQL. Rozhraní API pro dotazy JavaScriptu umožňuje programově vytvářet dotazy předáváním predikátových funkcí do posloupnosti volání funkcí. Dotazy se analyzují modulem runtime JavaScriptu a efektivně se spouštějí v rámci služby Azure Cosmos DB. Informace o podpoře rozhraní API pro dotazy JavaScriptu najdete v článku Práce s rozhraním API pro dotazy integrované v jazyce JavaScript . Příklady najdete v článku Postup zápisu uložených procedur a triggerů pomocí rozhraní API pro dotazy JavaScriptu .

Další kroky

V následujících článcích se dozvíte, jak psát a používat uložené procedury, triggery a uživatelem definované funkce ve službě Azure Cosmos DB:

Pokoušíte se naplánovat kapacitu pro migraci do služby Azure Cosmos DB? Informace o existujícím databázovém clusteru můžete použít k plánování kapacity.