Поделиться через


Хранимые процедуры, триггеры и определяемые пользователем функции

Azure Cosmos DB обеспечивает интегрированное с языком выполнение транзакций на JavaScript. При использовании API для NoSQL в Azure Cosmos DB можно создавать хранимые процедуры, триггеры и определяемые пользователем функции (ОПРЕДЕЛЯЕМЫЕ пользователем функции) на языке JavaScript. Логику можно написать в JavaScript, которая выполняется внутри ядра СУБД. Вы можете создавать и исполнять триггеры, хранимые процедуры и пользовательские функции с помощью портала Azure, API интегрированных запросов JavaScript в Azure Cosmos DB или клиентских SDK для Azure Cosmos DB (версия для NoSQL).

Преимущества использования серверного программирования

Написание хранимых процедур, триггеров и определяемых пользователем функций (UDFS) в JavaScript позволяет создавать расширенные приложения, и они имеют следующие преимущества:

  • Процедурная логика: JavaScript — это высокоуровневый язык программирования, который предоставляет широкий и знакомый интерфейс для выражения бизнес-логики. Можно выполнить последовательность сложных операций с данными.

  • Атомарные транзакции: Операции базы данных Azure Cosmos DB, выполняемые в рамках одной хранимой процедуры или триггера, являются атомарными. Эта атомарная функциональность позволяет приложению объединять связанные операции в один пакет, чтобы все операции были успешно выполнены или ни одна из них не выполнена.

  • Производительность: Данные JSON изначально сопоставляются с системой типов языка JavaScript. Это сопоставление позволяет выполнять ряд оптимизаций, таких как отложенная материализация документов JSON в буферном пуле, делая их доступными по запросу в исполняемом коде. Существуют и другие преимущества производительности, связанные с перемещением бизнес-логики в базу данных, включая:

    • Пакетная обработка: Вы можете группировать такие операции, как вставки, и отправлять их оптом. Затраты на задержку сетевого трафика и затраты на обработку для создания отдельных транзакций значительно сокращаются.

    • Предварительная компиляция: Хранимые процедуры, триггеры и функции, определяемые пользователем, неявно компилируются в формат байт-кода, чтобы избежать затрат на компиляцию во время вызова каждого скрипта. В связи с предварительной компиляцией вызов хранимых процедур осуществляется быстро и с низким использованием ресурсов.

    • Последовательности: Иногда для операций требуется механизм активации, который может выполнять одно или дополнительное обновление данных. Помимо атомарности, при выполнении на стороне сервера также существуют преимущества производительности.

  • Инкапсуляции: Хранимые процедуры можно использовать для группировки логики в одном месте. Инкапсуляция добавляет слой абстракции поверх данных, что позволяет развивать приложения независимо от данных. Этот уровень абстракции полезен, если данные не имеют схемы, и вам не нужно управлять добавлением дополнительной логики непосредственно в ваше приложение. Абстракция позволяет обеспечить безопасность данных, упрощая доступ из скриптов.

Подсказка

Хранимые процедуры лучше всего подходят для операций с высокой нагрузкой на запись и требуют транзакции по значению ключа партиции. При выборе того, следует ли использовать хранимые процедуры, оптимизировать с акцентом на инкапсуляцию максимального количества записей. Как правило, хранимые процедуры не являются наиболее эффективным средством для выполнения большого количества операций чтения или запроса, поэтому использование хранимых процедур для пакетной обработки большого количества операций чтения для возврата клиенту не даст желаемого преимущества. Для повышения производительности эти операции с большим объемом чтения должны выполняться на стороне клиента с помощью пакета SDK Azure Cosmos DB.

Использование хранимых процедур с строгой консистентностью не рекомендуется, так как мутации являются локальными.

Замечание

Функции JavaScript на стороне сервера, включая хранимые процедуры, триггеры и определяемые пользователем функции, не поддерживают импорт модулей.

Транзакции

Транзакция в типичной базе данных может быть определена как последовательность операций, выполняемых как одна логическая единица работы. Каждая транзакция предоставляет гарантии свойств ACID. ACID — это хорошо известное сокращение, которое означает: Атомарность, Согласованность, Изолированность и Надежность.

  • Атомарность гарантирует, что все операции, выполненные внутри транзакции, рассматриваются как единое целое, и либо все фиксируются, либо ни одна из них не фиксируется.

  • Согласованность гарантирует, что данные всегда находится в допустимом состоянии в транзакциях.

  • Изоляция гарантирует, что две транзакции не вмешиваются друг в друга, многие коммерческие системы обеспечивают несколько уровней изоляции, которые можно использовать в зависимости от потребностей приложения.

  • Устойчивость гарантирует, что все изменения, зафиксированные в базе данных, всегда будут присутствовать.

В Azure Cosmos DB среда выполнения JavaScript размещается в ядре СУБД. Поэтому запросы, сделанные в хранимых процедурах, и триггеры выполняются в той же области, что и сеанс базы данных. Эта функция позволяет Azure Cosmos DB гарантировать свойства ACID для всех операций, которые являются частью хранимой процедуры или триггера. Примеры см. в статье о реализации транзакций .

Подсказка

Для поддержки транзакций в Azure Cosmos DB для NoSQL можно также реализовать пакет транзакций с помощью предпочтительного клиентского пакета SDK. Дополнительные сведения см. в разделе "Транзакционные пакетные операции" в Azure Cosmos DB для NoSQL.

Область транзакции

Хранимые процедуры связаны с контейнером Azure Cosmos DB и выполнение хранимой процедуры ограничивается ключом логического раздела. Хранимые процедуры должны содержать значение ключа логического раздела во время выполнения, определяющее логическую секцию для области транзакции. Дополнительные сведения см. в статье о секционированиях Azure Cosmos DB .

Фиксация и откат

Транзакции изначально интегрированы в модель программирования JavaScript в Azure Cosmos DB. В функции JavaScript все операции автоматически упаковываются в одну транзакцию. Если логика JavaScript в хранимой процедуре завершается без каких-либо исключений, все операции в транзакции фиксируются в базе данных. Операторы, такие как BEGIN TRANSACTION и COMMIT TRANSACTION (знакомые с реляционными базами данных), неявно используются в Azure Cosmos DB. Если из скрипта есть какие-либо исключения, среда выполнения JavaScript Azure Cosmos DB откатит всю транзакцию. Таким образом, выбрасывание исключения по сути эквивалентно вызову функции ROLLBACK TRANSACTION в Azure Cosmos DB.

Согласованность данных

Хранимые процедуры и триггеры всегда выполняются на первичной реплике контейнера Azure Cosmos DB. Эта функция гарантирует, что операции чтения из хранимых процедур обеспечивают надежную согласованность. Запросы с помощью определяемых пользователем функций можно выполнять на первичной или любой вторичной реплике. Хранимые процедуры и триггеры предназначены для поддержки транзакционных операций записи данных. При этом логика только для чтения лучше всего реализуется как логика и запросы на стороне приложения с помощью Azure Cosmos DB для SDK NoSQL, которые помогут вам обеспечить пропускную способность базы данных.

Подсказка

Запросы, выполняемые в хранимой процедуре или триггере, могут не видеть изменения элементов, сделанных той же транзакцией скрипта. Эта инструкция применяется как к запросам SQL, таким как , так и к интегрированным языковым запросам, таким как getContent().getCollection().queryDocuments()getContext().getCollection().filter().

Ограниченное выполнение

Все операции Azure Cosmos DB должны завершиться в течение указанного времени ожидания. Хранимые процедуры имеют ограничение времени ожидания в 5 секунд. Это ограничение применяется к функциям JavaScript — хранимым процедурам, триггерам и пользовательским функциям. Если операция не завершена в течение этого периода времени, транзакция откатится.

Вы можете либо убедиться, что ваши функции JavaScript завершают работу в пределах установленного времени, либо реализовать модель на основе продолжения для пакетного выполнения/возобновления выполнения. Чтобы упростить разработку хранимых процедур и триггеров для обработки ограничений времени, все функции в контейнере Azure Cosmos DB (например, создание, чтение, обновление и удаление элементов) возвращают логическое значение, представляющее, будет ли эта операция завершена. Если это значение равно false, это означает, что процедура должна быть завершена, так как скрипт занимает больше времени или подготовленную пропускную способность, чем настроенное значение. Операции, поставленные в очередь до первой непринятой операции хранения, гарантированно завершаются, если хранимая процедура завершается вовремя и более не ставит запросы в очередь. Таким образом, операции следует помещать в очередь последовательно, используя соглашение callback в JavaScript для управления потоком выполнения скрипта. Так как скрипты выполняются в серверной среде, они строго управляются. Скрипты, которые повторно нарушают границы выполнения, могут быть помечены как неактивные и не могут выполняться, и их следует воссоздать с учетом границ выполнения.

Функции JavaScript также подвержены подготовленной пропускной способности. Функции JavaScript могут в конечном итоге использовать большое количество единиц запросов в течение короткого времени и могут быть ограничены скоростью, если достигнуто ограничение емкости подготовленной пропускной способности. Важно отметить, что скрипты требуют дополнительной пропускной способности помимо той, которая затрачивается на выполнение операций базы данных, хотя выполнение этих операций обходится немного дешевле по сравнению с выполнением тех же операций с клиента.

Triggers

Azure Cosmos DB поддерживает два типа триггеров:

Предварительные триггеры

Azure Cosmos DB предоставляет триггеры, которые можно вызвать, выполнив операцию в элементе Azure Cosmos DB. Например, можно указать предварительный триггер при создании элемента. В этом случае перед созданием элемента будет запущен предварительный триггер. Предварительные триггеры не могут иметь входные параметры. При необходимости объект запроса можно использовать для обновления текста документа из исходного запроса. При регистрации триггеров пользователи могут указать операции, с которыми он может работать. Если триггер был создан с помощью TriggerOperation.Create, в результате нельзя использовать триггер в операции замены. Примеры см. в статье о написании триггеров .

Триггеры после активации

Аналогично предварительным триггерам, последующие триггеры также связаны с операцией на элементе Azure Cosmos DB и не требуют входных параметров. Они выполняются после завершения операции и имеют доступ к сообщению ответа, отправленного клиенту. Примеры см. в статье о написании триггеров .

Замечание

Зарегистрированные триггеры не выполняются автоматически при выполнении соответствующих операций (создание, удаление, замена и обновление). Они должны быть явно вызваны при выполнении этих операций. Дополнительные сведения см. в статье о запуске триггеров .

Функции, определённые пользователем

Определяемые пользователем функции используются для расширения синтаксиса языка запросов NOSQL и реализации пользовательской бизнес-логики. Их можно вызывать только в запросах. Пользовательские функции (UDFs) не имеют доступа к объекту контекста и предназначены для использования исключительно для вычислений в JavaScript. Таким образом, определяемые пользователем функции могут выполняться на вторичных репликах.

API запросов, интегрированных с языком JavaScript

Помимо выдачи запросов с помощью синтаксиса запросов API для NoSQL, пакет SDK на стороне сервера позволяет выполнять запросы с помощью интерфейса JavaScript без каких-либо знаний о SQL. API запросов JavaScript позволяет программно создавать запросы путем передачи предикатных функций в последовательность вызовов функций. Запросы анализируются средой выполнения JavaScript и выполняются эффективно в Azure Cosmos DB. Сведения о поддержке API запросов JavaScript см. в статье о работе с интегрированным API запросов JavaScript. Примеры см. в статье "Как записывать хранимые процедуры и триггеры с помощью API запросов JavaScript ".

Дальнейшие шаги

Узнайте, как записывать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB со следующими статьями:

Пытаетесь составить план мощностей для миграции в Azure Cosmos DB? Для планирования ресурсов можно использовать сведения об имеющемся кластере базы данных.