Lagrade procedurer, utlösare och användardefinierade funktioner

GÄLLER FÖR: NoSQL

Azure Cosmos DB tillhandahåller språkintegrerad, transaktionell körning av JavaScript. När du använder API:et för NoSQL i Azure Cosmos DB kan du skriva lagrade procedurer, utlösare och användardefinierade funktioner (UDF:er) på Språket JavaScript. Du kan skriva logiken i JavaScript, som körs i databasmotorn. Du kan skapa och köra utlösare, lagrade procedurer och UDF:er med hjälp av Azure Portal, det integrerade fråge-API:et för JavaScript-språk i Azure Cosmos DB eller Azure Cosmos DB för NoSQL-klient-SDK:er.

Fördelar med att använda programmering på serversidan

Genom att skriva lagrade procedurer, utlösare och användardefinierade funktioner (UDF:er) i JavaScript kan du skapa omfattande program och de har följande fördelar:

  • Procedurlogik: JavaScript som ett högnivåprogrammeringsspråk som ger ett omfattande och välbekant gränssnitt för att uttrycka affärslogik. Du kan utföra en sekvens med komplexa åtgärder på data.

  • Atomära transaktioner: Azure Cosmos DB-databasåtgärder som utförs inom en enda lagrad procedur eller en utlösare är atomära. Med den här atomära funktionen kan ett program kombinera relaterade åtgärder till en enda batch, så att alla åtgärder lyckas eller att ingen av dem lyckas.

  • Prestanda: JSON-data mappas i sig till javascript-språktypssystemet. Den här mappningen möjliggör ett antal optimeringar som uppskjuten materialisering av JSON-dokument i buffertpoolen och gör dem tillgängliga på begäran för körningskoden. Det finns andra prestandafördelar som är kopplade till att flytta affärslogik till databasen, bland annat:

    • Dosering: Du kan gruppera åtgärder som infogningar och skicka dem i grupp. Kostnaderna för svarstid för nätverkstrafik och butikskostnaderna för att skapa separata transaktioner minskas avsevärt.

    • Förkompilering: Lagrade procedurer, utlösare och UDF:er förkompileras implicit till bytekodformatet för att undvika kompileringskostnader vid tidpunkten för varje skriptanrop. På grund av förkompilering är anropet av lagrade procedurer snabbt och har ett lågt fotavtryck.

    • Sekvensering: Ibland behöver åtgärder en utlösande mekanism som kan utföra en eller flera uppdateringar av data. Förutom Atomicitet finns det även prestandafördelar vid körning på serversidan.

  • Inkapsling: Lagrade procedurer kan användas för att gruppera logik på ett och samma ställe. Inkapsling lägger till ett abstraktionslager ovanpå data, vilket gör att du kan utveckla dina program oberoende av data. Det här abstraktionsskiktet är användbart när data är schemalösa och du inte behöver hantera att lägga till ytterligare logik direkt i ditt program. Med abstraktionen kan du skydda dina data genom att effektivisera åtkomsten från skripten.

Tips

Lagrade procedurer passar bäst för åtgärder som är skrivintensiva och kräver en transaktion över ett partitionsnyckelvärde. När du bestämmer dig för om du vill använda lagrade procedurer optimerar du runt kapsling av den maximala mängden skrivningar som är möjligt. I allmänhet är lagrade procedurer inte det mest effektiva sättet att utföra ett stort antal läs- eller frågeåtgärder, så att använda lagrade procedurer för att batchlagrar ett stort antal läsningar för att återgå till klienten ger inte önskad fördel. För bästa prestanda bör dessa läsintensiva åtgärder utföras på klientsidan med hjälp av Azure Cosmos DB SDK.

Anteckning

JavaScript-funktioner på serversidan, inklusive lagrade procedurer, utlösare och användardefinierade funktioner, stöder inte import av moduler.

Transaktioner

Transaktioner i en typisk databas kan definieras som en sekvens med åtgärder som utförs som en enda logisk arbetsenhet. Varje transaktion ger ACID-egenskapsgarantier. ACID är en välkänd förkortning som står för: Atomicity, Consistency, Isolation, and Durability.

  • Atomicitet garanterar att alla åtgärder som utförs i en transaktion behandlas som en enda enhet, och att alla antingen checkas in eller att ingen av dem är det.

  • Konsekvens säkerställer att data alltid är i ett giltigt tillstånd mellan transaktioner.

  • Isolering garanterar att inga två transaktioner stör varandra – många kommersiella system tillhandahåller flera isoleringsnivåer som kan användas baserat på programmets behov.

  • Hållbarhet säkerställer att alla ändringar som görs i en databas alltid finns.

I Azure Cosmos DB finns JavaScript-körning i databasmotorn. Begäranden som görs i de lagrade procedurerna och utlösarna körs därför i samma omfång som databassessionen. Med den här funktionen kan Azure Cosmos DB garantera ACID-egenskaper för alla åtgärder som ingår i en lagrad procedur eller en utlösare. Exempel finns i artikeln om hur du implementerar transaktioner .

Tips

För transaktionsstöd i Azure Cosmos DB for NoSQL kan du även implementera en transaktionsbatch med din önskade klient-SDK. Mer information finns i Transaktionella batchåtgärder i Azure Cosmos DB för NoSQL.

Omfång för en transaktion

Lagrade procedurer är associerade med en Azure Cosmos DB-container och körningen av lagrad procedur är begränsad till en logisk partitionsnyckel. Lagrade procedurer måste innehålla ett nyckelvärde för logisk partition under körningen som definierar den logiska partitionen för transaktionens omfång. Mer information finns i artikeln Azure Cosmos DB-partitionering .

Checka in och återställa

Transaktioner är inbyggda i Programmeringsmodellen Azure Cosmos DB JavaScript. I en JavaScript-funktion omsluts alla åtgärder automatiskt under en enda transaktion. Om JavaScript-logiken i en lagrad procedur slutförs utan undantag allokeras alla åtgärder i transaktionen till databasen. Instruktioner som BEGIN TRANSACTION och COMMIT TRANSACTION (bekanta för relationsdatabaser) är implicita i Azure Cosmos DB. Om det finns några undantag från skriptet återställer Azure Cosmos DB JavaScript-körningen hela transaktionen. Därför är utlöser ett undantag i praktiken motsvarar en ROLLBACK TRANSACTION i Azure Cosmos DB.

Datakonsekvens

Lagrade procedurer och utlösare körs alltid på den primära repliken av en Azure Cosmos DB-container. Den här funktionen säkerställer att läsningar från lagrade procedurer ger stark konsekvens. Frågor som använder användardefinierade funktioner kan köras på den primära eller valfria sekundära repliken. Lagrade procedurer och utlösare är avsedda att stödja transaktionella skrivningar – under tiden implementeras skrivskyddad logik bäst som logik på programsidan och frågor som använder Azure Cosmos DB for NoSQL SDK:er, vilket hjälper dig att mätta databasens dataflöde.

Tips

De frågor som körs i en lagrad procedur eller utlösare kanske inte ser ändringar i objekt som görs av samma skripttransaktion. Den här instruktionen gäller både för SQL-frågor, till exempel getContent().getCollection.queryDocuments(), samt integrerade språkfrågor, till exempel getContext().getCollection().filter().

Begränsad körning

Alla Azure Cosmos DB-åtgärder måste slutföras inom den angivna tidsgränsen. Lagrade procedurer har en tidsgräns på 5 sekunder. Den här begränsningen gäller för JavaScript-funktioner – lagrade procedurer, utlösare och användardefinierade funktioner. Om en åtgärd inte slutförs inom den tidsgränsen återställs transaktionen.

Du kan antingen se till att JavaScript-funktionerna slutförs inom tidsgränsen eller implementera en fortsättningsbaserad modell för att batch-/återuppta körningen. För att förenkla utvecklingen av lagrade procedurer och utlösare för att hantera tidsgränser returnerar alla funktioner under Azure Cosmos DB-containern (till exempel skapa, läsa, uppdatera och ta bort objekt) ett booleskt värde som representerar om åtgärden ska slutföras. Om det här värdet är falskt är det en indikation på att proceduren måste avsluta körningen eftersom skriptet förbrukar mer tid eller etablerat dataflöde än det konfigurerade värdet. Åtgärder i kö före den första icke-undantagna lagringsåtgärden slutförs garanterat om den lagrade proceduren slutförs i tid och inte köar fler begäranden. Därför ska åtgärder placeras i kö en i taget med hjälp av Återanropskonventionen i JavaScript för att hantera skriptets kontrollflöde. Eftersom skript körs i en miljö på serversidan är de strikt styrda. Skript som upprepade gånger bryter mot körningsgränserna kan markeras som inaktiva och kan inte köras, och de bör återskapas för att respektera körningsgränserna.

JavaScript-funktioner omfattas också av etablerad dataflödeskapacitet. JavaScript-funktioner kan potentiellt komma att använda ett stort antal enheter för programbegäran inom en kort tid och kan vara frekvensbegränsade om kapacitetsgränsen för etablerat dataflöde nås. Det är viktigt att notera att skript förbrukar ytterligare dataflöde utöver det dataflöde som används för att köra databasåtgärder, även om dessa databasåtgärder är något billigare än att köra samma åtgärder från klienten.

Utlösare

Azure Cosmos DB kan användas med två typer av utlösare:

Förutlösare

Azure Cosmos DB tillhandahåller utlösare som kan anropas genom att utföra en åtgärd på ett Azure Cosmos DB-objekt. Du kan till exempel ange en förutlösare när du skapar ett objekt. Då körs förutlösaren innan objektet skapas. Förutlösare kan inte ha några indataparametrar. Om det behövs kan det begärda objektet användas för att uppdatera dokumenttexten från den ursprungliga begäran. När utlösare har registrerats kan användarna ange vilka åtgärder som de kan köras med. Om en utlösare skapades med TriggerOperation.Create, innebär det att det inte är tillåtet att använda utlösaren i en ersättningsåtgärd. Exempel finns i artikeln Skriva utlösare .

Efterutlösare

På samma sätt som förutlösare är efterutlösare också associerade med en åtgärd på ett Azure Cosmos DB-objekt och de kräver inga indataparametrar. De körs när åtgärden har slutförts och har åtkomst till svarsmeddelandet som skickas till klienten. Exempel finns i artikeln Skriva utlösare .

Anteckning

Registrerade utlösare körs inte automatiskt när motsvarande åtgärder (skapa/ta bort/ersätt/uppdatera) inträffar. De måste anropas explicit när åtgärderna utförs. Mer information finns i artikeln om hur du kör utlösare .

Användardefinierade funktioner

Användardefinierade funktioner (UDF: er) används för att utöka API:et för NoSQL-frågespråksyntax och enkelt implementera anpassad affärslogik. De kan bara anropas i frågor. UDF:er har inte åtkomst till kontextobjektet och är avsedda att användas som beräkning endast JavaScript. Därför kan UDF:er köras på sekundära repliker.

JavaScript-språkintegrerad fråge-API

Förutom att utfärda frågor med hjälp av API för NoSQL-frågesyntax kan du utföra frågor med SDK på serversidan med hjälp av ett JavaScript-gränssnitt utan någon kunskap om SQL. Med JavaScript-fråge-API:et kan du programmatiskt skapa frågor genom att skicka predikatfunktioner i sekvenser med funktionsanrop. Frågor parsas av JavaScript-körningen och körs effektivt i Azure Cosmos DB. Mer information om stöd för JavaScript-fråge-API finns i artikeln Arbeta med JavaScript-språkintegrerad fråge-API . Exempel finns i artikeln Så här skriver du lagrade procedurer och utlösare med Hjälp av JavaScript Query API .

Nästa steg

Lär dig hur du skriver och använder lagrade procedurer, utlösare och användardefinierade funktioner i Azure Cosmos DB med följande artiklar:

Försöker du göra kapacitetsplanering för en migrering till Azure Cosmos DB? Du kan använda information om ditt befintliga databaskluster för kapacitetsplanering.