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

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

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

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

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

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

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

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

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

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

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

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

Совет

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

Примечание.

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

Транзакции

Транзакции в типичной базе данных могут быть определены как последовательность операций, выполняемых в одной логической единице работы. Каждая транзакция предоставляет гарантию выполнения принципа 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 azure Cosmos DB для NoSQL, которые помогут вам обеспечить пропускную способность базы данных.

Совет

В запросах, выполняемых в хранимой процедуре или триггере, могут не отражаться изменения элементов, внесенные в той же транзакции скрипта. Это относится как к запросам 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). При выполнении этих операций их приходится вызывать явным образом. Дополнительные сведения см. в статье о запуске триггеров.

Пользовательские функции

Определяемые пользователем функции используются для расширения синтаксиса языка запросов 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, Для планирования ресурсов можно использовать сведения об имеющемся кластере базы данных.