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 dla 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 i wykonać ją w aparacie bazy danych. Wyzwalacze, procedury składowane i funkcje zdefiniowane przez użytkownika można tworzyć i wykonywać przy użyciu Azure Portal, zintegrowanego interfejsu API zapytań języka JavaScript w usłudze Azure Cosmos DB lub zestawów SDK klienta NoSQL usługi Azure Cosmos DB.

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 jako język programowania wysokiego poziomu, który udostępnia bogaty i znany interfejs do wyrażania logiki biznesowej. Można 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ści: 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ą:

    • Tworzenie pakietów wsadowych: Operacje, takie jak wstawianie, można grupować i przesyłać je zbiorczo. Koszty opóźnienia ruchu sieciowego i obciążenie magazynu w celu utworzenia oddzielnych transakcji są znacznie mniejsze.

    • Wstępna kompilacja: Procedury składowane, wyzwalacze i funkcje zdefiniowane przez użytkownika są niejawnie wstępnie skompilowane do formatu 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ą bez schematu i nie trzeba zarządzać dodawaniem dodatkowej logiki bezpośrednio do aplikacji. Abstrakcja pozwala zapewnić bezpieczeństwo danych dzięki usprawnieniu dostępu ze skryptów.

Porada

Procedury składowane najlepiej nadają się do operacji z dużą liczbą operacji i wymagają transakcji w obrębie wartości klucza partycji. Podczas podejmowania decyzji, czy należy używać procedur składowanych, zoptymalizuj wokół hermetyzacji maksymalnej możliwej ilości operacji zapisu. Ogólnie rzecz biorąc, procedury składowane nie są najbardziej efektywnym sposobem wykonywania dużej liczby operacji odczytu lub zapytań, dlatego użycie procedur składowanych w celu dzielenia dużej liczby operacji odczytu w celu powrotu do klienta nie przyniesie żądanej korzyści. Aby uzyskać najlepszą wydajność, należy wykonać te operacje z dużą liczbą operacji odczytu 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

Transakcji w typowej bazie danych można zdefiniować jako sekwencję 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 żadne 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 nawzajem — 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 .

Porada

W przypadku obsługi transakcji w usłudze Azure Cosmos DB dla NoSQL można 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 w usłudze 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 skrypt ma jakiekolwiek wyjątki, ś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 elementy w ROLLBACK TRANSACTION 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. Dzięki tej funkcji odczyty z procedur składowanych zapewniają silną spójność. Zapytania korzystające z funkcji zdefiniowanych przez użytkownika można wykonywać w podstawowej lub dowolnej repliki pomocniczej. Procedury składowane i wyzwalacze są przeznaczone do obsługi zapisów transakcyjnych — tymczasem logika tylko do odczytu jest najlepiej zaimplementowana jako logika po stronie aplikacji i zapytania korzystające z zestawów SDK NoSQL usługi Azure Cosmos DB, pomoże Ci wyczyszczeniu przepływności bazy danych.

Porada

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

Powiązane wykonywanie

Wszystkie operacje usługi Azure Cosmos DB muszą zostać ukoń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) zwracają wartość logiczną, która określa, czy ta operacja zostanie ukończona. Jeśli ta wartość jest fałszywa, oznacza to, że procedura musi zakończyć wykonywanie, ponieważ skrypt zużywa więcej czasu lub aprowizowanej przepływności niż skonfigurowana wartość. Operacje w kolejce przed pierwszą nieakceptowaną operacją magazynu są gwarantowane, 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 korzystać z 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ż wykonywanie tych samych operacji od klienta.

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 w przypadku wyzwalaczy wstępnych, wyzwalacze wykonywane 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 występują 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żywane 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 obliczenia tylko w języku JavaScript. W związku z tym funkcje zdefiniowane przez użytkownika mogą być uruchamiane w replikach pomocniczych.

Interfejs API zapytań zintegrowanych z 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 JavaScript bez znajomości języka SQL. Interfejs API zapytań Języka JavaScript umożliwia programowe tworzenie 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? Do planowania pojemności można użyć informacji o istniejącym klastrze bazy danych.