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 in de database-engine. U kunt triggers, opgeslagen procedures en UDF's maken en uitvoeren met behulp van Azure Portal, de geïntegreerde JavaScript-query-API in Azure Cosmos DB of de SDK's van de Azure Cosmos DB for NoSQL-client.

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 hebben ze de volgende voordelen:

  • Procedurele logica: JavaScript is een programmeertaal op hoog niveau die een uitgebreide en vertrouwde interface biedt om bedrijfslogica uit te drukken. U kunt een reeks complexe bewerkingen op de gegevens uitvoeren.

  • 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 niet.

  • Prestaties: de JSON-gegevens worden intrinsiek toegewezen aan het JavaScript-taaltypesysteem. Met deze toewijzing kunt u een aantal optimalisaties uitvoeren, zoals luie materialisatie van JSON-documenten in de buffergroep en deze op aanvraag beschikbaar maken voor de uitvoercode. Er zijn andere prestatievoordelen die zijn gekoppeld aan het verplaatsen van bedrijfslogica naar de database, waaronder:

    • Batchverwerking: U kunt bewerkingen zoals invoegingen groeperen en bulksgewijs verzenden. De kosten voor netwerkverkeerlatentie en de overhead van de winkel om afzonderlijke transacties te maken, worden aanzienlijk verminderd.

    • Precompilatie: opgeslagen procedures, triggers en UDF's worden impliciet vooraf gecompileerd in de bytecode-indeling om compilatiekosten te voorkomen op het moment van elke aanroep van scripts. Vanwege precompilatie is de aanroep van opgeslagen procedures snel en heeft een lage footprint.

    • Sequentiëren: Soms hebben bewerkingen een triggermechanisme nodig dat een of meer updates voor de gegevens kan uitvoeren. Naast Atomiciteit zijn er ook prestatievoordelen bij het uitvoeren aan de serverzijde.

  • Inkapseling: Opgeslagen procedures kunnen worden gebruikt om logica op één plaats te groeperen. Met inkapseling wordt een abstractielaag toegevoegd boven op de gegevens, waarmee u uw toepassingen onafhankelijk van de gegevens kunt ontwikkelen. Deze abstractielaag is handig wanneer de gegevens schemaloos zijn en u geen extra logica rechtstreeks in uw toepassing hoeft toe te voegen. Met de abstractie kunt u de gegevens beveiligen door de toegang vanuit de scripts te stroomlijnen.

Tip

Opgeslagen procedures zijn het meest geschikt voor bewerkingen die schrijfintensief zijn en waarvoor een transactie is vereist voor een partitiesleutelwaarde. Bij het bepalen of opgeslagen procedures moeten worden gebruikt, optimaliseert u de maximale hoeveelheid schrijfbewerkingen. 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 batcheren om terug te keren naar de client, levert niet het gewenste voordeel op. Voor de beste prestaties moeten deze leesintensieve bewerkingen aan de clientzijde worden uitgevoerd 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-eigenschapsgaranties. ACID is een bekend acroniem dat staat voor: Atomicity, Consistency, Isolation en Durability.

  • Atomiciteit garandeert dat alle bewerkingen die binnen een transactie worden uitgevoerd, worden behandeld als één eenheid, en dat ze allemaal worden doorgevoerd of geen van deze bewerkingen.

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

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

  • Duurzaamheid zorgt ervoor dat elke wijziging die wordt doorgevoerd in een database altijd aanwezig is.

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 over het implementeren van transacties 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 een logische partitiesleutelwaarde bevatten tijdens de uitvoering die de logische partitie definieert voor het bereik van de transactie. Zie het artikel over partitionering van Azure Cosmos DB voor meer informatie.

Doorvoeren en terugdraaien

Transacties worden systeemeigen geïntegreerd in het JavaScript-programmeermodel van Azure Cosmos DB. 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 is alleen-lezenlogica het beste geïmplementeerd als logica aan de toepassingszijde en query's met behulp van de Azure Cosmos DB for NoSQL SDK's, waardoor u de doorvoer van de database kunt verzadiging.

Tip

De query's die worden uitgevoerd in een opgeslagen procedure of trigger, zien mogelijk geen wijzigingen in items die door dezelfde scripttransactie zijn aangebracht. Deze instructie is zowel van toepassing op SQL-query's, zoals getContent().getCollection().queryDocuments(), als geïntegreerde taalquery's, 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 is voltooid, wordt de transactie teruggedraaid.

U kunt ervoor zorgen dat uw JavaScript-functies binnen de tijdslimiet worden voltooid of een vervolgmodel implementeren om de uitvoering in batch/hervatten uit te voeren. Om de ontwikkeling van opgeslagen procedures en triggers voor het afhandelen van tijdslimieten te vereenvoudigen, retourneren alle functies onder de Azure Cosmos DB-container (bijvoorbeeld items maken, lezen, bijwerken en verwijderen) een booleaanse waarde die aangeeft of deze bewerking wordt voltooid. Als deze waarde onwaar is, is het een indicatie dat de procedure de uitvoering moet afronden omdat het script meer tijd of ingerichte doorvoer verbruikt dan de geconfigureerde waarde. Bewerkingen die vóór de eerste niet-begeleide opslagbewerking in de wachtrij worden geplaatst, worden gegarandeerd voltooid als de opgeslagen procedure op tijd is voltooid en geen aanvragen meer in de wachtrij zet. Bewerkingen moeten dus één voor één in de wachtrij worden geplaatst met behulp van de callbackconventie 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 en 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 zijn mogelijk beperkt als de ingerichte doorvoercapaciteitslimiet is bereikt. Het is belangrijk te weten dat scripts extra doorvoer verbruiken naast de doorvoer die is besteed aan het uitvoeren van databasebewerkingen, hoewel deze databasebewerkingen iets goedkoper zijn dan dezelfde bewerkingen die worden uitgevoerd 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 bij te werken vanuit de oorspronkelijke aanvraag. 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 Over het schrijven van triggers voor voorbeelden.

Post-triggers

Net als bij pre-triggers, post-triggers, zijn ook gekoppeld aan een bewerking op een Azure Cosmos DB-item en zijn er 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 Over het schrijven van triggers 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 over het uitvoeren van triggers 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 aangepaste bedrijfslogica eenvoudig te implementeren. Ze kunnen alleen worden aangeroepen binnen query's. UDF's hebben geen toegang tot het contextobject en zijn bedoeld om te worden gebruikt als alleen-compute JavaScript. Daarom kunnen UDF's worden uitgevoerd op secundaire replica's.

Met de taal geïntegreerde JavaScript-query-API

Naast het uitgeven van query's met api voor NoSQL-querysyntaxis, kunt u met de SDK aan de serverzijde query's uitvoeren met behulp van een JavaScript-interface zonder enige kennis van SQL. Met de JavaScript-query-API kunt u programmatisch query's bouwen door predicaatfuncties door te geven aan een reeks functie-aanroepen. Query's worden geparseerd door de JavaScript-runtime en worden efficiënt uitgevoerd in Azure Cosmos DB. Zie het artikel Werken met geïntegreerde query-API-artikel over javaScript-taal voor meer informatie over de ondersteuning van de JavaScript-query-API . Zie Het artikel over het schrijven van opgeslagen procedures en triggers met behulp van javaScript Query-API-artikel 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 de volgende artikelen:

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