Procedury składowane, wyzwalacze i funkcje zdefiniowane przez użytkownika

DOTYCZY: NoSQL

Usługa Azure Cosmos DB zapewnia zintegrowane z językiem, transakcyjne wykonywanie kodu języka JavaScript. W przypadku korzystania z interfejsu API for NoSQL w usłudze Azure Cosmos DB można pisać procedury składowane, wyzwalacze i funkcje zdefiniowane przez użytkownika (UDF) w języku JavaScript. Logikę można napisać w języku JavaScript, który jest wykonywany wewnątrz aparatu bazy danych. Wyzwalacze, procedury składowane i funkcje zdefiniowane przez użytkownika można tworzyć i wykonywać przy użyciu witryny Azure Portal, zintegrowanego interfejsu API zapytań języka JavaScript w usłudze Azure Cosmos DB lub zestawów SDK klienta usługi Azure Cosmos DB for NoSQL.

Zalety korzystania z programowania po stronie serwera

Pisanie procedur składowanych, wyzwalaczy i funkcji zdefiniowanych przez użytkownika (UDF) w języku JavaScript umożliwia tworzenie zaawansowanych aplikacji i mają następujące zalety:

  • Logika proceduralna: JavaScript to język programowania wysokiego poziomu, który udostępnia bogaty i znany interfejs do wyrażania logiki biznesowej. Możesz wykonać sekwencję złożonych operacji na danych.

  • Transakcje niepodzielne: operacje bazy danych usługi Azure Cosmos DB wykonywane w ramach jednej procedury składowanej lub wyzwalacza są niepodzielne. Ta niepodzielna funkcja umożliwia aplikacji łączenie powiązanych operacji w jedną partię, dzięki czemu wszystkie operacje kończą się powodzeniem lub żaden z nich nie powiedzie się.

  • Wydajność: dane JSON są wewnętrznie mapowane na system typów języka JavaScript. To mapowanie umożliwia szereg optymalizacji, takich jak leniwe materializacja dokumentów JSON w puli buforów i udostępnianie ich na żądanie do wykonywania kodu. Istnieją inne korzyści z wydajności związane z przenoszeniem logiki biznesowej do bazy danych, które obejmują:

    • Przetwarzanie wsadowe: operacje grupowania, takie jak wstawianie i przesyłanie ich zbiorczo. Koszty opóźnienia ruchu sieciowego i koszty związane z magazynem w celu utworzenia oddzielnych transakcji są znacznie mniejsze.

    • Wstępna kompilacja: procedury składowane, wyzwalacze i funkcje zdefiniowane przez użytkownika są niejawnie kompilowane w formacie kodu bajtowego, aby uniknąć kosztów kompilacji w momencie wywołania każdego skryptu. Ze względu na wstępną kompilację wywołanie procedur składowanych jest szybkie i ma niski ślad.

    • Sekwencjonowanie: czasami operacje wymagają mechanizmu wyzwalania, który może wykonywać jedną lub dodatkową aktualizację danych. Oprócz niepodzielności istnieją również korzyści z wydajności podczas wykonywania po stronie serwera.

  • Hermetyzacja: procedury składowane mogą służyć do grupowania logiki w jednym miejscu. Hermetyzacja dodaje warstwę abstrakcji na podstawie danych, która umożliwia rozwijanie aplikacji niezależnie od danych. Ta warstwa abstrakcji jest przydatna, gdy dane są mniej schematu i nie trzeba zarządzać dodawaniem dodatkowej logiki bezpośrednio do aplikacji. Abstrakcja umożliwia zapewnienie bezpieczeństwa danych dzięki usprawnieniu dostępu ze skryptów.

Napiwek

Procedury składowane najlepiej nadają się do operacji, które są ciężkie do zapisu i wymagają transakcji w obrębie wartości klucza partycji. Podczas podejmowania decyzji, czy należy używać procedur składowanych, należy zoptymalizować wokół hermetyzacji maksymalnej możliwej ilości operacji zapisu. Mówiąc ogólnie, procedury składowane nie są najbardziej wydajnymi środkami do wykonywania dużej liczby operacji odczytu lub zapytań, więc użycie procedur składowanych w celu wsadowania dużej liczby odczytów w celu powrotu do klienta nie przyniesie pożądanych korzyści. Aby uzyskać najlepszą wydajność, te operacje z dużym obciążeniem do odczytu powinny być wykonywane po stronie klienta przy użyciu zestawu SDK usługi Azure Cosmos DB.

Uwaga

Funkcje języka JavaScript po stronie serwera, w tym procedury składowane, wyzwalacze i funkcje zdefiniowane przez użytkownika, nie obsługują importowania modułów.

Transakcje

Transakcja w typowej bazie danych może być zdefiniowana jako sekwencja operacji wykonywanych jako pojedyncza jednostka logiczna pracy. Każda transakcja zapewnia gwarancje właściwości ACID. ACID to dobrze znany akronim, który oznacza: tomicity, Consistency, Isolation i Durability.

  • Niepodzielność gwarantuje, że wszystkie operacje wykonywane wewnątrz transakcji są traktowane jako pojedyncza jednostka, a wszystkie z nich są zatwierdzane lub żadna z nich.

  • Spójność zapewnia, że dane są zawsze w prawidłowym stanie między transakcjami.

  • Izolacja gwarantuje, że żadne dwie transakcje nie zakłócają siebie — wiele systemów komercyjnych zapewnia wiele poziomów izolacji, które mogą być używane na podstawie potrzeb aplikacji.

  • Trwałość gwarantuje, że każda zmiana zatwierdzona w bazie danych zawsze będzie obecna.

W usłudze Azure Cosmos DB środowisko uruchomieniowe języka JavaScript jest hostowane wewnątrz aparatu bazy danych. W związku z tym żądania wykonywane w ramach procedur składowanych i wyzwalaczy są wykonywane w tym samym zakresie co sesja bazy danych. Ta funkcja umożliwia usłudze Azure Cosmos DB zagwarantowanie właściwości ACID dla wszystkich operacji, które są częścią procedury składowanej lub wyzwalacza. Aby zapoznać się z przykładami, zobacz artykuł dotyczący implementowania transakcji .

Napiwek

Aby uzyskać obsługę transakcji w usłudze Azure Cosmos DB dla NoSQL, możesz również zaimplementować transakcyjną partię przy użyciu preferowanego zestawu SDK klienta. Aby uzyskać więcej informacji, zobacz Operacje transakcyjne wsadowe w usłudze Azure Cosmos DB for NoSQL.

Zakres transakcji

Procedury składowane są skojarzone z kontenerem usługi Azure Cosmos DB, a wykonywanie procedury składowanej jest ograniczone do klucza partycji logicznej. Procedury składowane muszą zawierać wartość klucza partycji logicznej podczas wykonywania, która definiuje partycję logiczną dla zakresu transakcji. Aby uzyskać więcej informacji, zobacz artykuł dotyczący partycjonowania usługi Azure Cosmos DB.

Zatwierdzanie i wycofywanie

Transakcje są natywnie zintegrowane z modelem programowania JavaScript usługi Azure Cosmos DB. W ramach funkcji Języka JavaScript wszystkie operacje są automatycznie opakowane w ramach jednej transakcji. Jeśli logika języka JavaScript w procedurze składowanej zostanie ukończona bez żadnych wyjątków, wszystkie operacje w ramach transakcji są zatwierdzane w bazie danych. Instrukcje takie jak BEGIN TRANSACTION i COMMIT TRANSACTION (znane relacyjnym bazom danych) są niejawne w usłudze Azure Cosmos DB. Jeśli istnieją jakiekolwiek wyjątki od skryptu, środowisko uruchomieniowe javaScript usługi Azure Cosmos DB wycofa całą transakcję. W związku z tym zgłaszanie wyjątku jest skutecznie równoważne z elementem ROLLBACK TRANSACTION w usłudze Azure Cosmos DB.

Spójność danych

Procedury składowane i wyzwalacze są zawsze wykonywane w podstawowej repliki kontenera usługi Azure Cosmos DB. Ta funkcja zapewnia, że odczyty z procedur składowanych zapewniają silną spójność. Zapytania korzystające z funkcji zdefiniowanych przez użytkownika można wykonywać na podstawowej lub pomocniczej repliki. Procedury składowane i wyzwalacze są przeznaczone do obsługi zapisów transakcyjnych. W międzyczasie logika tylko do odczytu jest najlepiej zaimplementowana jako logika i zapytania po stronie aplikacji przy użyciu zestawów SDK usługi Azure Cosmos DB for NoSQL, co pomoże w saturacji przepływności bazy danych.

Napiwek

Zapytania wykonywane w ramach procedury składowanej lub wyzwalacza mogą nie widzieć zmian w elementach wprowadzonych przez tę samą transakcję skryptu. Ta instrukcja ma zastosowanie zarówno do zapytań SQL, takich jak getContent().getCollection().queryDocuments(), jak i zintegrowanych zapytań językowych, takich jak getContext().getCollection().filter().

Powiązane wykonywanie

Wszystkie operacje usługi Azure Cosmos DB muszą zostać zakończone w określonym przedziale czasu. Procedury składowane mają limit czasu 5 sekund. To ograniczenie dotyczy funkcji Języka JavaScript — procedur składowanych, wyzwalaczy i funkcji zdefiniowanych przez użytkownika. Jeśli operacja nie zostanie ukończona w tym limicie czasu, transakcja zostanie wycofana.

Możesz upewnić się, że funkcje języka JavaScript zakończą się w limicie czasu lub zaimplementuj model oparty na kontynuacji do wykonywania wsadowego/wznawiania. Aby uprościć opracowywanie procedur składowanych i wyzwalaczy w celu obsługi limitów czasu, wszystkie funkcje w kontenerze usługi Azure Cosmos DB (na przykład tworzenie, odczytywanie, aktualizowanie i usuwanie elementów) zwraca wartość logiczną, która reprezentuje, czy ta operacja zostanie ukończona. Jeśli ta wartość jest fałszywa, oznacza to, że procedura musi opakowować wykonywanie, ponieważ skrypt zużywa więcej czasu lub aprowizowaną przepływność niż skonfigurowana wartość. Operacje w kolejce przed pierwszą nieakceptowaną operacją magazynu mają gwarancję zakończenia, jeśli procedura składowana zostanie ukończona w czasie i nie spowoduje kolejkowania kolejnych żądań. W związku z tym operacje powinny być kolejkowane pojedynczo przy użyciu konwencji wywołania zwrotnego języka JavaScript w celu zarządzania przepływem sterowania skryptu. Ponieważ skrypty są wykonywane w środowisku po stronie serwera, są ściśle zarządzane. Skrypty, które wielokrotnie naruszają granice wykonywania, mogą być oznaczone jako nieaktywne i nie mogą być wykonywane i powinny być tworzone ponownie w celu przestrzegania granic wykonywania.

Funkcje języka JavaScript podlegają również aprowizowanej pojemności przepływności. Funkcje języka JavaScript mogą potencjalnie kończyć się użyciem dużej liczby jednostek żądań w krótkim czasie i mogą być ograniczone szybkością, jeśli zostanie osiągnięty limit pojemności aprowizowanej przepływności. Należy pamiętać, że skrypty zużywają dodatkową przepływność oprócz przepływności wydanej na wykonywanie operacji bazy danych, chociaż te operacje bazy danych są nieco tańsze niż te same operacje wykonywane na kliencie.

Wyzwalacze

Usługa Azure Cosmos DB obsługuje dwa typy wyzwalaczy:

Wyzwalacze wykonywane przed operacją

Usługa Azure Cosmos DB udostępnia wyzwalacze, które można wywołać, wykonując operację na elemencie usługi Azure Cosmos DB. Można na przykład wybrać wyzwalacz wykonywany przed operacją podczas tworzenia elementu. W takim przypadku wyzwalacz tego typu zostanie uruchomiony przed utworzeniem elementu. Wyzwalacze wykonywane przed operacją nie mogą mieć żadnych parametrów wejściowych. W razie potrzeby obiekt żądania może służyć do aktualizowania treści dokumentu z oryginalnego żądania. Podczas rejestrowania wyzwalaczy użytkownicy mogą określić operacje, z którymi można je uruchamiać. Jeśli wyzwalacz został utworzony przy użyciu elementu TriggerOperation.Create, oznacza to, że użycie wyzwalacza w operacji zastępowania nie będzie dozwolone. Przykłady można znaleźć w artykule How to write triggers (Jak pisać wyzwalacze ).

Wyzwalacze wykonywane po operacji

Podobnie jak wyzwalacze wstępne, wyzwalacze po operacji są również skojarzone z operacją w elemencie usługi Azure Cosmos DB i nie wymagają żadnych parametrów wejściowych. Są one uruchamiane po zakończeniu operacji i mają dostęp do komunikatu odpowiedzi wysyłanego do klienta. Przykłady można znaleźć w artykule How to write triggers (Jak pisać wyzwalacze ).

Uwaga

Zarejestrowane wyzwalacze nie są uruchamiane automatycznie, gdy są wykonywane odpowiednie operacje (tworzenie/usuwanie/zastępowanie/aktualizowanie). Należy je jawnie wywoływać podczas wykonywania tych operacji. Aby dowiedzieć się więcej, zobacz artykuł dotyczący uruchamiania wyzwalaczy .

Funkcje zdefiniowane przez użytkownika

Funkcje zdefiniowane przez użytkownika (UDF) służą do rozszerzania interfejsu API dla składni języka zapytań NoSQL i łatwego implementowania niestandardowej logiki biznesowej. Mogą być wywoływane tylko w zapytaniach. Funkcje zdefiniowane przez użytkownika nie mają dostępu do obiektu kontekstu i mają być używane jako język JavaScript tylko do obliczeń. W związku z tym funkcje zdefiniowane przez użytkownika można uruchamiać w replikach pomocniczych.

Interfejs API zapytań zintegrowanych ze językiem JavaScript

Oprócz wykonywania zapytań przy użyciu interfejsu API dla składni zapytań NoSQL zestaw SDK po stronie serwera umożliwia wykonywanie zapytań przy użyciu interfejsu Języka JavaScript bez znajomości języka SQL. Interfejs API zapytań Języka JavaScript umożliwia programowe kompilowanie zapytań przez przekazywanie funkcji predykatu do sekwencji wywołań funkcji. Zapytania są analizowane przez środowisko uruchomieniowe języka JavaScript i są wykonywane wydajnie w usłudze Azure Cosmos DB. Aby dowiedzieć się więcej na temat obsługi interfejsu API zapytań języka JavaScript, zobacz Artykuł Praca ze zintegrowanym interfejsem API zapytań języka JavaScript. Przykłady można znaleźć w artykule How to write stored procedures and triggers using JavaScript Query API (Jak pisać procedury składowane i wyzwalacze przy użyciu interfejsu API zapytań Języka JavaScript).

Następne kroki

Dowiedz się, jak pisać i używać procedur składowanych, wyzwalaczy i funkcji zdefiniowanych przez użytkownika w usłudze Azure Cosmos DB, korzystając z następujących artykułów:

Próbujesz zaplanować pojemność migracji do usługi Azure Cosmos DB? Informacje o istniejącym klastrze bazy danych można użyć do planowania pojemności.