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 zapisovat uložené procedury, triggery a uživatelem definované funkce (UDF) v jazyce JavaScript. Logiku můžete napsat 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í webu 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

Psaní 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 je programovací jazyk vysoké úrovně, který poskytuje bohaté a známé rozhraní pro vyjádření obchodní logiky. Na datech můžete provádět posloupnost složitých operací.

  • Atomické transakce: Databázové operace Azure Cosmos DB prováděné 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, aby všechny operace byly úspěšné nebo žádné z nich neuspěly.

  • 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 spuštěný kód. S přesunem obchodní logiky do databáze jsou spojené další výhody výkonu, mezi které patří:

    • Dávkování: Operace jako vložení můžete seskupit a odeslat je hromadně. Náklady na latenci síťového provozu a režijní náklady na úložiště pro vytvoření samostatných transakcí se výrazně snižují.

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

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

  • Zapouzdření: Uložené procedury lze použít k seskupení logiky na jednom místě. Zapouzdření přidá nad data abstrakci vrstvu, která umožňuje vyvíjet aplikace nezávisle na datech. Tato vrstva abstrakce je užitečná, když jsou data méně schématu a nemusíte spravovat přidávání další logiky přímo do aplikace. Abstrakce umožňuje zabezpečit data tím, že zpřístupní 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 v rámci hodnoty klíče oddílu. Při rozhodování, zda použít uložené procedury, optimalizujte kolem 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 dotazů, takže použití uložených procedur k dávce velkého počtu čtení, které se mají vrátit 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í provedených jako jedna logická jednotka práce. Každá transakce poskytuje záruky vlastností ACID. ACID je dobře známá zkratka, která je zkratka: Atomicity, Consistency, Isolation a Durability.

  • Atomicita zaručuje, že všechny operace provedené uvnitř transakce jsou považovány za jednu jednotku a všechny z nich jsou potvrzeny 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, které jsou potvrzeny v databázi, budou vždy přítomny.

Ve službě Azure Cosmos DB je javascriptový modul runtime 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 implementace transakcí .

Tip

Pro podporu transakcí ve službě Azure Cosmos DB for NoSQL 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 vymezeno 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 o dělení služby Azure Cosmos DB.

Potvrzení a vrácení zpět

Transakce se nativně integrují do programovacího modelu JavaScriptu služby Azure Cosmos DB. V rámci javascriptové funkce se všechny operace automaticky zabalí do jedné transakce. Pokud se logika JavaScriptu v uložené proceduře dokončí bez výjimek, všechny operace v rámci transakce jsou potvrzeny 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 dojde ke výjimkám ze skriptu, modul runtime JavaScriptu služby Azure Cosmos DB vrátí zpět celou transakci. Vyvolání výjimky je tedy v podstatě ekvivalentní k objektu 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čeny k podpoře transakčních zápisů. Logika jen pro čtení je mezitím nejlépe implementovaná jako logika a dotazy na straně aplikace pomocí sad SDK služby Azure Cosmos DB for NoSQL, což vám pomůže s nasycením propustnosti 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, například getContent().getCollection().queryDocuments(), tak i na integrované dotazy jazyka, například getContext().getCollection().filter().

Omezené spouštění

Všechny operace Azure Cosmos DB se musí dokončit v zadané době časového limitu. Uložené procedury mají časový limit 5 sekund. Toto omezení platí pro javascriptové funkce – uložené procedury, triggery a uživatelem definované funkce. Pokud operace není dokončena v rámci časového limitu, transakce se vrátí zpět.

Můžete buď zajistit, aby se funkce JavaScriptu dokončily v časovém limitu, nebo implementovat model založený na pokračování pro dávkové nebo obnovení provádění. Aby bylo možné zjednodušit vývoj uložených procedur a triggerů pro zpracování časových limitů, vrátí všechny funkce v kontejneru Azure Cosmos DB (například vytváření, čtení, aktualizace a odstraňování položek) 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 zabírají více času nebo zřízenou propustnost, než je nakonfigurovaná hodnota. Operace zařazené do fronty před první nepovolenou operací úložiště jsou zaručeny, že se dokončí, pokud se uložená procedura dokončí včas a nezařadí do fronty žádné další požadavky. Operace by proto měly být zařazeny do fronty po jednom pomocí javascriptové konvence zpětného volání pro správu toku řízení skriptu. Vzhledem k tomu, že skripty se spouští 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í.

Na funkce JavaScriptu se vztahuje také zřízená kapacita propustnosti. Funkce JavaScriptu můžou potenciálně za krátkou dobu používat velký počet jednotek žádostí a v případě dosažení limitu kapacity zřízené propustnosti můžou být omezené rychlostí. Je důležité si uvědomit, že skripty spotřebovávají další propustnost kromě propustnosti strávené prováděním databázových operací, i když tyto databázové operace jsou o něco levnější než stejné operace spuštěné 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 u položky služby 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 lze objekt požadavku použít k aktualizaci textu dokumentu z původního 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 Postup zápisu triggerů .

Triggery po akci

Podobně jako před triggery jsou následné triggery přidružené také k operaci u položky 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 Postup zápisu triggerů .

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 spouštění triggerů .

Uživatelem definované funkce

Uživatelem definované funkce (UDF) slouží k rozšíření syntaxe dotazovacího jazyka API pro NoSQL a snadné implementaci vlastní obchodní logiky. Volat je lze pouze v rámci dotazů. Funkce definované uživatelem nemají přístup k objektu kontextu a mají být použity jako JavaScript jen pro výpočetní prostředky. Funkce definované uživatelem je proto možné spouštět na sekundárních replikách.

Rozhraní API pro dotazy integrované v jazyce JavaScript

Kromě vydávání dotazů pomocí syntaxe dotazů API for NoSQL umožňuje sada SDK na straně serveru provádět dotazy pomocí javascriptového rozhraní bez jakýchkoli znalostí SQL. Rozhraní API pro dotazy JavaScriptu umožňuje programově sestavovat dotazy předáváním funkcí predikátu 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. Další informace o podpoře rozhraní API pro dotazy JavaScriptu najdete v článku o práci s integrovaným rozhraním API pro dotazy jazyka JavaScript. Příklady najdete v článku o 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 migrace do služby Azure Cosmos DB? Informace o stávajícím databázovém clusteru můžete použít k plánování kapacity.