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

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

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

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

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

  • Процедурная логика. Язык программирования высокого уровня JavaScript предоставляет многофункциональный и удобный интерфейс для реализации бизнес-логики. Вы можете выполнять последовательность сложных операций с данными.

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

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

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

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

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

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

Совет

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

Примечание

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

Transactions

Транзакции в типичной базе данных могут быть определены как последовательность операций, выполняемых в одной логической единице работы. Каждая транзакция предоставляет гарантию выполнения принципа ACID. Широко известный акроним ACID обозначает четыре свойства: Atomicity (атомарность), Consistency (согласованность), Isolation (изолированность) и Durability (устойчивость).

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

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

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

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

В 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. Эта возможность гарантирует, что операции чтения в хранимых процедурах обеспечивают сильную согласованность. Запросы с использованием пользовательских функций могут выполняться на первичной либо на любой вторичной реплике. Хранимые процедуры и триггеры предназначены для поддержки транзакционных операций записи. В то же время логика только для чтения лучше всего реализована как логика на стороне приложения, а запросы с помощью пакетов SDK для NoSQL для Azure Cosmos DB помогут вам повысить пропускную способность базы данных.

Совет

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

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

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

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

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

Триггеры

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

Триггеры предварительного выполнения

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

Триггеры последующего выполнения

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

Примечание

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

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

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

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

Помимо выполнения запросов с помощью синтаксиса запросов API для NoSQL, серверный пакет SDK позволяет выполнять запросы с помощью интерфейса JavaScript без каких-либо знаний о SQL. API запросов JavaScript позволяет программно создавать запросы, передавая функции предикатов в последовательность вызовов функций. Запросы анализируются средой выполнения JavaScript и эффективно выполняются в Azure Cosmos DB. Дополнительные сведения о поддержке API запросов JavaScript см. в статье Working with JavaScript language integrated query API (Как работать с API запросов с интегрированным языком JavaScript). Примеры см. в статье How to write stored procedures and triggers using JavaScript Query API (Как записывать хранимые процедуры и триггеры в Azure Cosmos DB с помощью API запросов JavaScript).

Дальнейшие действия

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

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