Udostępnij za pośrednictwem


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 atomowe: operacje bazy danych Azure Cosmos DB wykonywane w ramach jednej procedury składowanej lub wyzwalacza są atomowe. Funkcjonalność atomowa umożliwia aplikacji łączenie powiązanych operacji w jedną partię, dzięki czemu wszystkie operacje kończą się powodzeniem lub żadna 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 opóźniona materializacja dokumentów JSON w przestrzeni buforowej i udostępnianie ich na żądanie wykonywanemu kodowi. Istnieją inne korzyści z wydajności związane z przenoszeniem logiki biznesowej do bazy danych, które obejmują:

    • Przetwarzanie wsadowe: Możesz grupować operacje, takie jak wstawianie, i przesyłać je 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 użytkownika są niejawnie kompilowane 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 małe zużycie zasobów.

    • Sekwencjonowanie: czasami operacje wymagają mechanizmu wyzwalania, który może wykonywać jedną lub dodatkową aktualizację danych. Oprócz Atomicity istnieją również korzyści wydajnościowe podczas procesu 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ą pozbawione schematu i nie musisz 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 skupić się na optymalizacji zawierania jak największej liczby operacji zapisu. Mówiąc ogólnie, procedury składowane nie są najbardziej wydajnym sposobem na wykonywanie dużej liczby operacji odczytu lub zapytań, więc użycie procedur składowanych do zwrócenia dużej liczby odczytów 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.

Używanie procedur składowanych z silną spójnością nie jest zalecane, ponieważ mutacje są lokalne.

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 gwarancję właściwości ACID. ACID to dobrze znany akronim, który oznacza: Atomowość, Spójność, Izolację i Trwałość.

  • Niepodzielność gwarantuje, że wszystkie operacje wykonywane w ramach transakcji są traktowane jako pojedyncza całość, i albo wszystkie są zatwierdzane, albo żadna.

  • 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 silnika 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. Funkcja ta umożliwia usłudze Azure Cosmos DB gwarantowanie właściwości ACID dla wszystkich operacji, które są częścią procedury przechowywanej 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 pakietu SDK klienckiego. Aby uzyskać więcej informacji, zobacz Wsadowe operacje transakcyjne w usłudze Azure Cosmos DB dla 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 w trakcie wykonywania, która definiuje partycję logiczną określającą zakres transakcji. Aby uzyskać więcej informacji, zobacz artykuł dotyczący partycjonowania usługi Azure Cosmos DB.

Zatwierdzanie i cofanie

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 zakończy się bez żadnych wyjątków, wszystkie operacje w ramach transakcji zostają zatwierdzone w bazie danych. Instrukcje takie jak BEGIN TRANSACTION i COMMIT TRANSACTION (znane relacyjnym bazom danych) są domyślnie uwzględnione 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 przechowywane i wyzwalacze są zawsze wykonywane na podstawowej replice 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 wtórnej kopii zapasowej. Procedury składowane i wyzwalacze są przeznaczone do obsługi zapisów transakcyjnych. Tymczasem logika tylko do odczytu najlepiej sprawdza się jako logika po stronie aplikacji wraz z zapytaniami, przy użyciu Azure Cosmos DB for NoSQL SDK, co pomoże w pełnym wykorzystaniu przepustowości bazy danych.

Napiwek

Zapytania wykonywane w ramach procedury składowanej lub wyzwalacza mogą nie dostrzegać 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().

Ograniczone wykonywanie

Wszystkie operacje usługi Azure Cosmos DB muszą zostać zakończone w określonym przedziale czasu. Procedury składowane mają maksymalnie 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 zadbać, aby funkcje JavaScript zakończyły się w czasowym limicie lub zaimplementować model oparty na kontynuacji do wsadowego wykonania/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ć wykonanie, ponieważ skrypt zużywa więcej czasu lub aprowizowaną przepływność niż skonfigurowana wartość. Operacje umieszczone w kolejce przed pierwszą niezaakceptowaną operacją przechowywania mają gwarancję zakończenia, jeśli procedura przechowywana zostanie ukończona w określonym czasie i nie umieści więcej żądań w kolejce. 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, a zatem powinny być odtworzone, aby przestrzegać granic wykonywania.

Funkcje języka JavaScript podlegają również zapewnionej przepustowości. Funkcje języka JavaScript mogą potencjalnie kończyć się użyciem dużej liczby jednostek zapytań w krótkim czasie i mogą być ograniczone pod względem szybkości, jeśli zostanie osiągnięty limit przepływności aprowizowanej. 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 wstępne

Usługa Azure Cosmos DB udostępnia wyzwalacze, które można wywołać, wykonując operację na elemencie usługi Azure Cosmos DB. Na przykład możesz określić wyzwalacz wstępny podczas tworzenia elementu. W takim przypadku wyzwalacz uruchomi się przed utworzeniem elementu. Wyzwalacze wstępne 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 TriggerOperation.Create, oznacza to, że użycie wyzwalacza w operacji zamiany nie będzie dozwolone. Przykłady można znaleźć w artykule How to write triggers (Jak pisać wyzwalacze ).

Wyzwalacze po zdarzeniu

Podobnie jak wyzwalacze wstępne, wyzwalacze końcowe także są powiązane z operacją na elemencie w usłudze 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. UDF nie mają dostępu do obiektu kontekstu i mają być używane jako JavaScript wyłącznie do obliczeń. W związku z tym funkcje zdefiniowane przez użytkownika można uruchamiać w replikach wtórnych.

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 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:

Czy planujesz zasoby na potrzeby migracji do usługi Azure Cosmos DB? Informacje o istniejącym klastrze bazy danych można użyć do planowania pojemności.