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å JavaScript-språket. 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-portalen, det integrerade fråge-API:et för JavaScript i Azure Cosmos DB eller Azure Cosmos DB for 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 är ett programmeringsspråk på hög nivå 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.

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

  • Prestanda: JSON-data mappas i sig till JavaScript-språktypssystemet. Den här mappningen möjliggör ett antal optimeringar som lat 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:

    • Batchbearbetning: Du kan gruppera åtgärder som infogningar och skicka dem i grupp. Kostnaderna för nätverkstrafikfördröjning och lagringskostnaderna 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 Atomicity finns det även prestandafördelar vid körning på serversidan.

  • Inkapsling: Lagrade procedurer kan användas för att gruppera logik på ett 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 data genom att effektivisera åtkomsten från skripten.

Dricks

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 inkapsling av maximal mängd skrivningar som 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 batcha 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.

Kommentar

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 akronym 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 antingen är alla incheckade eller ingen av dem.

  • 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 kommer att finnas.

I Azure Cosmos DB finns JavaScript-körning i databasmotorn. Begäranden som görs inom 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 .

Dricks

För transaktionsstöd i Azure Cosmos DB för NoSQL kan du även implementera en transaktionsbatch med din föredragna 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 lagrade procedurer ä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 om partitionering av Azure Cosmos DB.

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, checkas alla åtgärder i transaktionen in i 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 transaktionsskrivningar. Under tiden implementeras skrivskyddad logik bäst som logik på programsidan och frågor med hjälp av Azure Cosmos DB för NoSQL SDK:er, vilket hjälper dig att mätta databasens dataflöde.

Dricks

De frågor som körs inom 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 SQL-frågor, till exempel getContent().getCollection().queryDocuments(), och 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 har slutförts inom den tidsgränsen återställs transaktionen.

Du kan antingen se till att JavaScript-funktionerna är klara inom tidsgränsen eller implementera en fortsättningsbaserad modell för batch-/återuppta körning. 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 kommer att 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 som köas före den första oaccepterade lagringsåtgärden kommer garanterat att slutföras om den lagrade proceduren slutförs i tid och inte köar några fler begäranden. Därför bör åtgärder köas en i taget med hjälp av JavaScripts återanropskonvention för att hantera skriptets kontrollflöde. Eftersom skript körs i en miljö på serversidan styrs de strikt. 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 begäranden inom en kort tid och kan vara hastighetsbegränsade om kapacitetsgränsen för etablerat dataflöde nås. Det är viktigt att observera 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 samma åtgärder som körs 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 begärandeobjektet 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 Så här skriver du utlösare .

Efterutlösare

På samma sätt som förutlösare är post-triggers 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 Så här skriver du utlösare .

Kommentar

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 JavaScript endast för beräkning. 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 api för NoSQL-frågesyntax kan du med SDK på serversidan utföra frågor 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 till en sekvens 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 planera kapacitet för en migrering till Azure Cosmos DB? Du kan använda information om ditt befintliga databaskluster för kapacitetsplanering.