Tárolt eljárások, eseményindítók és felhasználó által definiált függvények

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Az Azure Cosmos DB a JavaScript nyelvintegrált, tranzakciós végrehajtását nyújtja. A NoSQL-hez készült API Azure Cosmos DB-ben való használatakor tárolt eljárásokat, eseményindítókat és felhasználó által definiált függvényeket (UDF-eket) írhat JavaScript nyelven. A logikát JavaScriptben is megírhatja, amely az adatbázismotoron belül lesz végrehajtva. Eseményindítókat, tárolt eljárásokat és UDF-eket az Azure Portal, az Azure Cosmos DB JavaScript nyelvbe integrált lekérdezési API-ja vagy az Azure Cosmos DB for NoSQL-ügyféloldali SDK-k használatával hozhat létre és hajthat végre.

A kiszolgálóoldali programozás használatának előnyei

A tárolt eljárások, eseményindítók és felhasználó által definiált függvények (UDF-ek) JavaScriptben való írásával gazdag alkalmazásokat hozhat létre, és az alábbi előnyökkel jár:

  • Eljárási logika: A JavaScript egy magas szintű programozási nyelv, amely gazdag és ismerős felületet biztosít az üzleti logika kifejezéséhez. Az adatokon összetett műveletek sorozatát hajthatja végre.

  • Atomi tranzakciók: Az azure Cosmos DB-adatbázisműveletek, amelyeket egyetlen tárolt eljáráson vagy eseményindítón hajtanak végre, atomiak. Ez az atomi funkció lehetővé teszi, hogy egy alkalmazás egyetlen kötegbe egyesítse a kapcsolódó műveleteket, hogy az összes művelet sikeres legyen, vagy egyik sem legyen sikeres.

  • Teljesítmény: A JSON-adatok belsőleg a JavaScript nyelvtípus-rendszerhez vannak leképezve. Ez a leképezés számos optimalizálást tesz lehetővé, például a JSON-dokumentumok lusta materializálását a pufferkészletben, és igény szerint elérhetővé teszi őket a végrehajtó kód számára. Az üzleti logika adatbázisba való áthelyezésének egyéb teljesítménybeli előnyei is vannak, amelyek a következők:

    • Kötegelés: Csoportosíthatja a műveleteket, például a beszúrásokat, és tömegesen elküldheti őket. Jelentősen csökkennek a hálózati forgalom késési költségei és a külön tranzakciók létrehozásához használt tár többletterhelése.

    • Előfordítás: A tárolt eljárásokat, eseményindítókat és UDF-eket implicit módon előre lefordítjuk a bájtkód formátumára, hogy elkerüljük a fordítási költségeket az egyes szkripthívások idején. Az előzetes összeállításnak köszönhetően a tárolt eljárások meghívása gyors, és alacsony a lábnyoma.

    • Szekvenálás: Néha a műveleteknek olyan triggerelési mechanizmusra van szükségük, amely egy vagy több frissítést hajthat végre az adatokon. Az Atomicity mellett a kiszolgálóoldali végrehajtásnak is vannak teljesítménybeli előnyei.

  • Beágyazás: A tárolt eljárások használatával a logikát egy helyen csoportosíthatja. Az encapsulation egy absztrakciós réteget ad hozzá az adatokhoz, így az adatoktól függetlenül fejlesztheti alkalmazásait. Ez az absztrakciós réteg akkor hasznos, ha az adatok séma nélküliek, és nem kell további logikát közvetlenül hozzáadni az alkalmazáshoz. Az absztrakció lehetővé teszi az adatok védelmét a szkriptek hozzáférésének streamével.

Tipp.

A tárolt eljárások leginkább olyan műveletekhez ideálisak, amelyek írási nehézkesek, és tranzakciót igényelnek egy partíciókulcs-értéken. Amikor eldönti, hogy használ-e tárolt eljárásokat, optimalizálja a lehető legnagyobb mennyiségű írás beágyazását. Általánosságban elmondható, hogy a tárolt eljárások nem a leghatékonyabb eszközök nagy számú olvasási vagy lekérdezési művelet végrehajtásához, így a tárolt eljárások nagy mennyiségű olvasás kötegelésére az ügyfélhez való visszatéréshez nem járnak a kívánt előnyökkel. A legjobb teljesítmény érdekében ezeket az írásvédett műveleteket az ügyféloldalon kell elvégezni az Azure Cosmos DB SDK használatával.

Feljegyzés

A kiszolgálóoldali JavaScript-funkciók, beleértve a tárolt eljárásokat, az eseményindítókat és a felhasználó által definiált függvényeket, nem támogatják a modulok importálását.

Tranzakciók

A tipikus adatbázisok tranzakciói egyetlen logikai munkaegységként végrehajtott műveletek sorozataként határozhatók meg. Minden tranzakció ACID-tulajdonsággaranciát biztosít. Az ACID egy jól ismert betűszó, amely a következőt jelenti: Atomicity, Consistency, Isolation, and Durability.

  • Az atomiság garantálja, hogy a tranzakción belül végrehajtott összes művelet egyetlen egységként lesz kezelve, és vagy mindegyik véglegesített, vagy egyik sem.

  • A konzisztencia biztosítja, hogy az adatok mindig érvényes állapotban legyenek a tranzakciók között.

  • Az elkülönítés garantálja, hogy két tranzakció ne zavarja egymást – számos kereskedelmi rendszer több elkülönítési szintet biztosít, amelyek az alkalmazás igényeinek megfelelően használhatók.

  • A tartósság biztosítja, hogy az adatbázisban véglegesített módosítások mindig jelen legyenek.

Az Azure Cosmos DB-ben a JavaScript-futtatókörnyezet az adatbázismotoron belül található. Ezért a tárolt eljárásokban és az eseményindítókban végrehajtott kérések az adatbázis-munkamenetével azonos hatókörben futnak. Ez a funkció lehetővé teszi, hogy az Azure Cosmos DB garantálja az ACID-tulajdonságokat minden olyan művelethez, amely egy tárolt eljárás vagy eseményindító részét képezi. Példák a tranzakciók implementálásáról szóló cikkre.

Tipp.

Az Azure Cosmos DB for NoSQL tranzakciós támogatásához tranzakciós köteget is implementálhat az előnyben részesített ügyféloldali SDK használatával. További információ: Tranzakciós kötegműveletek az Azure Cosmos DB for NoSQL-ben.

Tranzakció hatóköre

A tárolt eljárások egy Azure Cosmos DB-tárolóhoz vannak társítva, és a tárolt eljárások végrehajtása egy logikai partíciókulcsra terjed ki. A tárolt eljárásoknak tartalmazniuk kell egy logikai partíciókulcs-értéket a végrehajtás során, amely meghatározza a tranzakció hatókörének logikai partícióját. További információ: Azure Cosmos DB particionálási cikk.

Véglegesítés és visszaállítás

A tranzakciók natív módon integrálva vannak az Azure Cosmos DB JavaScript programozási modellbe. Egy JavaScript-függvényben az összes művelet automatikusan egyetlen tranzakció alá van burkolva. Ha egy tárolt eljárás JavaScript-logikája kivétel nélkül befejeződik, a tranzakción belüli összes művelet le lesz kötelezve az adatbázisra. A relációs adatbázisokhoz hasonló és COMMIT TRANSACTION ahhoz hasonló BEGIN TRANSACTION utasítások implicitek az Azure Cosmos DB-ben. Ha vannak kivételek a szkript alól, az Azure Cosmos DB JavaScript-futtatókörnyezete visszaállítja a teljes tranzakciót. Így a kivétel kivetése gyakorlatilag egyenértékű az Azure Cosmos DB-ben lévő kivételekkel ROLLBACK TRANSACTION .

Adatkonzisztencia

A tárolt eljárások és eseményindítók mindig egy Azure Cosmos DB-tároló elsődleges replikáján lesznek végrehajtva. Ez a funkció biztosítja, hogy a tárolt eljárásokból származó olvasások erős konzisztenciát biztosítsanak. A felhasználó által definiált függvényeket használó lekérdezések az elsődleges vagy bármely másodlagos replikán végrehajthatók. A tárolt eljárások és eseményindítók a tranzakciós írások támogatására szolgálnak. Mindeközben az írásvédett logika az alkalmazásoldali logika és a NoSQL SDK-khoz készült Azure Cosmos DB használatával végzett lekérdezések, amelyek segítenek az adatbázis átviteli sebességének telítődésében.

Tipp.

Előfordulhat, hogy a tárolt eljárásban vagy eseményindítóban végrehajtott lekérdezések nem látják az ugyanazon szkripttranzakció által végrehajtott elemek módosításait. Ez az utasítás az SQL-lekérdezésekre, például getContent().getCollection().queryDocuments()az integrált nyelvi lekérdezésekre, például getContext().getCollection().filter()a .

Kötött végrehajtás

Minden Azure Cosmos DB-műveletnek a megadott időtúllépési időtartamon belül kell befejeződnie. A tárolt eljárások időkorlátja 5 másodperc. Ez a korlátozás JavaScript-függvényekre – tárolt eljárásokra, eseményindítókra és felhasználó által definiált függvényekre – vonatkozik. Ha egy művelet nem fejeződik be ezen az időkereten belül, a rendszer visszaállítja a tranzakciót.

Biztosíthatja, hogy a JavaScript-függvények az időkorláton belül befejeződjenek, vagy folytatásalapú modellt implementáljon a kötegelt/folytatási végrehajtáshoz. Annak érdekében, hogy egyszerűbb legyen a tárolt eljárások és triggerek fejlesztése az időkorlátok kezeléséhez, az Azure Cosmos DB-tárolóban lévő összes függvény (például elemek létrehozása, olvasása, frissítése és törlése) egy logikai értéket ad vissza, amely jelzi, hogy a művelet befejeződik-e. Ha ez az érték hamis, az azt jelzi, hogy az eljárásnak be kell fejeznie a végrehajtást, mert a szkript több időt vagy kiosztott átviteli sebességet használ, mint a konfigurált érték. Az első nem észlelt tárolóművelet előtt várólistára helyezett műveletek garantáltan befejeződnek, ha a tárolt eljárás időben befejeződik, és nem küldi el a további kéréseket. Ezért a műveleteket egyenként kell sorba állítani a JavaScript visszahívási konvenciójával a szkript vezérlőfolyamatának kezeléséhez. Mivel a szkriptek kiszolgálóoldali környezetben vannak végrehajtva, szigorúan szabályozottak. Előfordulhat, hogy a végrehajtási határokat ismétlődően megsértő szkriptek inaktívként vannak megjelölve, és nem hajthatók végre, és újra létre kell hozni őket a végrehajtási határok betartásához.

A JavaScript-függvények kiépített átviteli kapacitásra is vonatkoznak. A JavaScript-függvények rövid időn belül nagy számú kérelemegységet használhatnak, és a kiosztott átviteli sebesség korlátjának elérése esetén a sebesség korlátozott lehet. Fontos megjegyezni, hogy a szkriptek az adatbázis-műveletek végrehajtásával töltött átviteli sebesség mellett további átviteli sebességet is használnak, bár ezek az adatbázis-műveletek valamivel olcsóbbak, mint az ügyféltől végrehajtott műveletek.

Triggerek

Az Azure Cosmos DB az eseményindítók két típusát támogatja:

Előzetes eseményindítók

Az Azure Cosmos DB olyan eseményindítókat biztosít, amelyek egy Azure Cosmos DB-elemen végzett művelet végrehajtásával hívhatók meg. Meghatározhat például egy előzetes eseményindítót, amikor elemet hoz létre. Ebben az esetben az előzetes eseményindító az elem létrehozása előtt fut. Az előzetes eseményindítóknak nem lehetnek bemeneti paramétereik. Szükség esetén a kérelemobjektum segítségével frissítheti a dokumentum törzsét az eredeti kérelemből. Az eseményindítók regisztrálásakor a felhasználók meghatározhatják azokat a műveleteket, amelyekkel futhatnak. Ha egy eseményindító a TriggerOperation.Create művelettel lett létrehozva, az azt jelenti, hogy az eseményindító nem használható csere műveletben. Példák: Eseményindítók írása című cikk.

Utólagos eseményindítók

Az előindítókhoz hasonlóan a post-triggerek is egy Azure Cosmos DB-elemen lévő művelethez vannak társítva, és nem igényelnek bemeneti paramétereket. A művelet befejezése után futnak, és hozzáférnek az ügyfélnek küldött válaszüzenethez. Példák: Eseményindítók írása című cikk.

Feljegyzés

A regisztrált eseményindítók nem futnak automatikusan, amikor a megfelelő műveletek (létrehozás/ törlés / csere / frissítés) történnek. Explicit módon kell meghívni őket a műveletek végrehajtásakor. További információkért tekintse meg az eseményindítók futtatásáról szóló cikket.

Felhasználó által definiált függvények

A felhasználó által definiált függvények (UDF-ek) a NoSQL-lekérdezési nyelv api-jának kibővítésére és az egyéni üzleti logika egyszerű implementálására szolgálnak. Ezek csak lekérdezésekben hívhatók meg. Az UDF-ek nem férnek hozzá a környezeti objektumhoz, és csak számítási célú JavaScriptként használhatók. Ezért az UDF-ek futtathatók másodlagos replikákon.

JavaScript nyelvvel integrált lekérdezési API

A NoSQL-lekérdezésszintaxishoz készült API-t használó lekérdezések kiadása mellett a kiszolgálóoldali SDK lehetővé teszi a lekérdezések végrehajtását JavaScript-felülettel, az SQL ismerete nélkül. A JavaScript lekérdezési API lehetővé teszi a lekérdezések programozását úgy, hogy predikátumfüggvényeket ad át függvényhívások sorozatának. A lekérdezéseket a JavaScript-futtatókörnyezet elemzi, és hatékonyan hajtja végre az Azure Cosmos DB-ben. A JavaScript lekérdezési API támogatásáról további információt a JavaScript nyelv integrált lekérdezési API-jával kapcsolatos cikkben talál. Példák : Tárolt eljárások és triggerek írása JavaScript Query API-cikk használatával.

Következő lépések

Az alábbi cikkekkel megtudhatja, hogyan írhat és használhat tárolt eljárásokat, eseményindítókat és felhasználó által definiált függvényeket az Azure Cosmos DB-ben:

Kapacitástervezést szeretne végezni az Azure Cosmos DB-be való migráláshoz? A kapacitástervezéshez használhatja a meglévő adatbázisfürt adatait.