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

ПРИМЕНИМО К: API SQL

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

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

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

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

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

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

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

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

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

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

Совет

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

Transactions

Транзакции в типичной базе данных могут быть определены как последовательность операций, выполняемых в одной логической единице работы. Каждая транзакция предоставляет гарантию выполнения принципа ACID. Широко известный акроним ACID обозначает четыре свойства: A tomicity (атомарность), C onsistency (согласованность), I solation (изолированность) и D urability (устойчивость).

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

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

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

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

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

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

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

Совет

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

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

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

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

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

Триггеры

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

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

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

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

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

Примечание

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

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

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

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

Кроме выдачи запросов с использованием синтаксиса запросов API SQL, серверный пакет 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? Для планирования ресурсов можно использовать сведения о существующем кластере базы данных.