Opgeslagen procedures, triggers en door de gebruiker gedefinieerde functies

VAN TOEPASSING OP: NoSQL

Azure Cosmos DB biedt taalgeïntegreerde, transactionele uitvoering van Java script. Wanneer u de API voor NoSQL in Azure Cosmos DB gebruikt, kunt u opgeslagen procedures, triggers en door de gebruiker gedefinieerde functies (UDF's) schrijven in de JavaScript-taal. U kunt uw logica schrijven in JavaScript die wordt uitgevoerd binnen de database-engine. U kunt triggers, opgeslagen procedures en UDF's maken en uitvoeren met behulp van Azure Portal, de geïntegreerde query-API van JavaScript in Azure Cosmos DB of de Client-SDK's van Azure Cosmos DB voor NoSQL.

Voordelen van het gebruik van programmeren aan de serverzijde

Door opgeslagen procedures, triggers en door de gebruiker gedefinieerde functies (UDF's) te schrijven in JavaScript, kunt u uitgebreide toepassingen bouwen en deze hebben de volgende voordelen:

  • Procedurelogica: JavaScript als een programmeertaal op hoog niveau die een uitgebreide en vertrouwde interface biedt voor het uitdrukken van bedrijfslogica. U kunt een reeks complexe bewerkingen uitvoeren op de gegevens.

  • Atomische transacties: Azure Cosmos DB-databasebewerkingen die worden uitgevoerd binnen één opgeslagen procedure of een trigger, zijn atomisch. Met deze atomische functionaliteit kan een toepassing gerelateerde bewerkingen combineren in één batch, zodat alle bewerkingen slagen of geen van deze bewerkingen.

  • Prestaties: De JSON-gegevens zijn intrinsiek toegewezen aan het JavaScript-taaltypesysteem. Deze toewijzing maakt een aantal optimalisaties mogelijk, zoals luie materialisatie van JSON-documenten in de buffergroep en deze op aanvraag beschikbaar maken voor de uitvoerende code. Er zijn andere prestatievoordelen verbonden aan het verplaatsen van bedrijfslogica naar de database, waaronder:

    • Batching: U kunt bewerkingen zoals invoegen groeperen en deze bulksgewijs verzenden. De kosten voor netwerkverkeerlatentie en de opslagoverhead voor het maken van afzonderlijke transacties worden aanzienlijk verminderd.

    • Pre-compilatie: Opgeslagen procedures, triggers en UDF's worden impliciet vooraf gecompileerd in de bytecode-indeling om compilatiekosten op het moment van elke scriptaanroep te voorkomen. Door de precompilatie is het aanroepen van opgeslagen procedures snel en heeft het een lage footprint.

    • Sequencing: Soms hebben bewerkingen een triggermechanisme nodig waarmee een of meer updates voor de gegevens kunnen worden uitgevoerd. Naast Atomicity zijn er ook prestatievoordelen bij het uitvoeren aan de serverzijde.

  • Inkapseling: Opgeslagen procedures kunnen worden gebruikt om logica op één plaats te groepeer. Encapsulation voegt een abstractielaag toe aan de gegevens, zodat u uw toepassingen onafhankelijk van de gegevens kunt ontwikkelen. Deze abstractielaag is handig wanneer de gegevens schemaloos zijn en u het toevoegen van extra logica niet rechtstreeks aan uw toepassing hoeft te beheren. Met de abstractie kunt u de gegevens veilig houden door de toegang vanuit de scripts te stroomlijnen.

Tip

Opgeslagen procedures zijn het meest geschikt voor bewerkingen met veel schrijfbewerkingen en waarvoor een transactie is vereist voor een partitiesleutelwaarde. Wanneer u besluit of u opgeslagen procedures wilt gebruiken, moet u de maximale hoeveelheid schrijfbewerkingen zo goed mogelijk inkapselen. Over het algemeen zijn opgeslagen procedures niet de meest efficiënte manier om grote aantallen lees- of querybewerkingen uit te voeren, dus het gebruik van opgeslagen procedures om grote aantallen leesbewerkingen te batchen om naar de client te retourneren, levert niet het gewenste voordeel op. Voor de beste prestaties moeten deze leesintensieve bewerkingen worden uitgevoerd aan de clientzijde, met behulp van de Azure Cosmos DB SDK.

Notitie

JavaScript-functies aan de serverzijde, waaronder opgeslagen procedures, triggers en door de gebruiker gedefinieerde functies, bieden geen ondersteuning voor het importeren van modules.

Transacties

Transactie in een typische database kan worden gedefinieerd als een reeks bewerkingen die worden uitgevoerd als één logische werkeenheid. Elke transactie biedt ACID-eigenschappengaranties. ACID is een bekend acroniem dat staat voor: Atomicity, Consistency, Isolation en Durability.

  • Atomicity garandeert dat alle bewerkingen die binnen een transactie worden uitgevoerd, als één eenheid worden behandeld en dat ze allemaal worden doorgevoerd of dat ze niet zijn.

  • Consistentie zorgt ervoor dat de gegevens altijd een geldige status hebben voor alle transacties.

  • Isolatie garandeert dat twee transacties elkaar niet verstoren: veel commerciële systemen bieden meerdere isolatieniveaus die kunnen worden gebruikt op basis van de behoeften van de toepassing.

  • Duurzaamheid zorgt ervoor dat wijzigingen die in een database worden doorgevoerd, altijd aanwezig zijn.

In Azure Cosmos DB wordt JavaScript-runtime gehost in de database-engine. Aanvragen binnen de opgeslagen procedures en de triggers worden daarom uitgevoerd in hetzelfde bereik als de databasesessie. Met deze functie kan Azure Cosmos DB ACID-eigenschappen garanderen voor alle bewerkingen die deel uitmaken van een opgeslagen procedure of een trigger. Zie het artikel Transacties implementeren voor voorbeelden.

Tip

Voor transactieondersteuning in Azure Cosmos DB for NoSQL kunt u ook een transactionele batch implementeren met behulp van de client-SDK van uw voorkeur. Zie Transactionele batchbewerkingen in Azure Cosmos DB voor NoSQL voor meer informatie.

Bereik van een transactie

Opgeslagen procedures zijn gekoppeld aan een Azure Cosmos DB-container en de uitvoering van opgeslagen procedures is gericht op een logische partitiesleutel. Opgeslagen procedures moeten tijdens de uitvoering een logische partitiesleutelwaarde bevatten waarmee de logische partitie voor het bereik van de transactie wordt gedefinieerd. Zie het artikel Azure Cosmos DB partitioneren voor meer informatie.

Doorvoeren en terugdraaien

Transacties zijn systeemeigen geïntegreerd in het Azure Cosmos DB JavaScript-programmeermodel. Binnen een JavaScript-functie worden alle bewerkingen automatisch verpakt onder één transactie. Als de JavaScript-logica in een opgeslagen procedure zonder uitzonderingen wordt voltooid, worden alle bewerkingen binnen de transactie doorgevoerd in de database. Instructies zoals BEGIN TRANSACTION en COMMIT TRANSACTION (bekend met relationele databases) zijn impliciet in Azure Cosmos DB. Als er uitzonderingen zijn op het script, wordt de volledige transactie teruggedraaid door de JavaScript-runtime van Azure Cosmos DB. Als zodanig is het genereren van een uitzondering in feite gelijk aan een ROLLBACK TRANSACTION in Azure Cosmos DB.

Gegevensconsistentie

Opgeslagen procedures en triggers worden altijd uitgevoerd op de primaire replica van een Azure Cosmos DB-container. Deze functie zorgt ervoor dat leesbewerkingen uit opgeslagen procedures een sterke consistentie bieden. Query's met door de gebruiker gedefinieerde functies kunnen worden uitgevoerd op de primaire of een secundaire replica. Opgeslagen procedures en triggers zijn bedoeld ter ondersteuning van transactionele schrijfbewerkingen. Ondertussen kan alleen-lezenlogica het beste worden geïmplementeerd als logica aan de toepassingszijde en query's die gebruikmaken van de Azure Cosmos DB voor NoSQL SDK's, helpen u de databasedoorvoer te verzadigen.

Tip

De query's die worden uitgevoerd in een opgeslagen procedure of trigger, zien mogelijk geen wijzigingen in items die door dezelfde scripttransactie zijn gemaakt. Deze instructie is van toepassing op zowel SQL-query's, zoals , als getContent().getCollection.queryDocuments()op query's voor geïntegreerde talen, zoals getContext().getCollection().filter().

Gebonden uitvoering

Alle Azure Cosmos DB-bewerkingen moeten binnen de opgegeven time-outduur worden voltooid. Opgeslagen procedures hebben een time-outlimiet van 5 seconden. Deze beperking is van toepassing op JavaScript-functies: opgeslagen procedures, triggers en door de gebruiker gedefinieerde functies. Als een bewerking niet binnen die tijdslimiet wordt voltooid, wordt de transactie teruggedraaid.

U kunt ervoor zorgen dat uw JavaScript-functies binnen de tijdslimiet zijn voltooid of een vervolgmodel implementeren om de uitvoering batchgewijs te hervatten of te hervatten. Om de ontwikkeling van opgeslagen procedures en triggers voor het afhandelen van tijdslimieten te vereenvoudigen, retourneren alle functies in de Azure Cosmos DB-container (bijvoorbeeld items maken, lezen, bijwerken en verwijderen) een Booleaanse waarde die aangeeft of die bewerking wordt voltooid. Als deze waarde onwaar is, is dit een indicatie dat de procedure de uitvoering moet afronden omdat het script meer tijd of ingerichte doorvoer verbruikt dan de geconfigureerde waarde. Bewerkingen die in de wachtrij zijn geplaatst vóór de eerste niet-geaccepteerde opslagbewerking, worden gegarandeerd voltooid als de opgeslagen procedure op tijd wordt voltooid en geen aanvragen meer in de wachtrij worden geplaatst. Daarom moeten bewerkingen één voor één in de wachtrij worden geplaatst met behulp van de callback-conventie van JavaScript om de controlestroom van het script te beheren. Omdat scripts worden uitgevoerd in een omgeving aan de serverzijde, worden ze strikt beheerd. Scripts die herhaaldelijk de uitvoeringsgrenzen schenden, kunnen worden gemarkeerd als inactief en kunnen niet worden uitgevoerd. Ze moeten opnieuw worden gemaakt om de uitvoeringsgrenzen te respecteren.

JavaScript-functies zijn ook onderhevig aan ingerichte doorvoercapaciteit. JavaScript-functies kunnen binnen korte tijd een groot aantal aanvraageenheden gebruiken en kunnen een frequentielimiet hebben als de ingerichte doorvoercapaciteitslimiet wordt bereikt. Het is belangrijk te weten dat scripts extra doorvoer verbruiken naast de doorvoer die wordt besteed aan het uitvoeren van databasebewerkingen, hoewel deze databasebewerkingen iets goedkoper zijn dan het uitvoeren van dezelfde bewerkingen vanaf de client.

Triggers

Azure Cosmos DB biedt ondersteuning voor twee typen triggers:

Pre-triggers

Azure Cosmos DB biedt triggers die kunnen worden aangeroepen door een bewerking uit te voeren op een Azure Cosmos DB-item. U kunt bijvoorbeeld een pre-trigger opgeven wanneer u een item maakt. In dit geval wordt de pre-trigger uitgevoerd voordat het item wordt gemaakt. Pre-triggers kunnen geen invoerparameters hebben. Indien nodig kan het aanvraagobject worden gebruikt om de hoofdtekst van het document van de oorspronkelijke aanvraag bij te werken. Wanneer triggers zijn geregistreerd, kunnen gebruikers de bewerkingen opgeven waarmee deze kunnen worden uitgevoerd. Als een trigger is gemaakt met TriggerOperation.Create, betekent dit dat het gebruik van de trigger in een vervangbewerking niet is toegestaan. Zie het artikel Triggers schrijven voor voorbeelden.

Post-triggers

Net als bij pre-triggers zijn post-triggers ook gekoppeld aan een bewerking op een Azure Cosmos DB-item en hiervoor zijn geen invoerparameters vereist. Ze worden uitgevoerd nadat de bewerking is voltooid en hebben toegang tot het antwoordbericht dat naar de client wordt verzonden. Zie het artikel Triggers schrijven voor voorbeelden.

Notitie

Geregistreerde triggers worden niet automatisch uitgevoerd wanneer de bijbehorende bewerkingen (maken/verwijderen/vervangen/bijwerken) plaatsvinden. Ze moeten expliciet worden aangeroepen bij het uitvoeren van deze bewerkingen. Zie het artikel Triggers uitvoeren voor meer informatie.

Door de gebruiker gedefinieerde functies

Door de gebruiker gedefinieerde functies (UDF's) worden gebruikt om de syntaxis van de API voor NoSQL-querytaal uit te breiden en eenvoudig aangepaste bedrijfslogica te implementeren. Ze kunnen alleen worden aangeroepen binnen query's. UDF's hebben geen toegang tot het contextobject en zijn bedoeld om alleen te worden gebruikt als JavaScript voor berekeningen. Daarom kunnen UDF's worden uitgevoerd op secundaire replica's.

Met javaScript geïntegreerde query-API

Naast het uitgeven van query's met behulp van API for NoSQL-querysyntaxis, kunt u met de SDK aan de serverzijde query's uitvoeren met behulp van een JavaScript-interface zonder kennis van SQL. Met de JavaScript-query-API kunt u programmatisch query's maken door predicaatfuncties door te geven in de volgorde van functie-aanroepen. Query's worden geparseerd door de JavaScript-runtime en worden efficiënt uitgevoerd in Azure Cosmos DB. Zie het artikel Working with JavaScript language integrated query API (Werken met geïntegreerde javaScript-query-API) voor meer informatie over ondersteuning voor JavaScript-query-API's . Zie het artikel How to write stored procedures and triggers using JavaScript Query API (Opgeslagen procedures en triggers schrijven met behulp van JavaScript Query-API ) voor voorbeelden.

Volgende stappen

Meer informatie over het schrijven en gebruiken van opgeslagen procedures, triggers en door de gebruiker gedefinieerde functies in Azure Cosmos DB met behulp van de volgende artikelen:

Wilt u capaciteitsplanning uitvoeren voor een migratie naar Azure Cosmos DB? U kunt informatie over uw bestaande databasecluster gebruiken voor capaciteitsplanning.