Создание хранимых процедур
Azure Cosmos DB обеспечивает встроенное в язык транзакционное выполнение JavaScript, которое позволяет писать хранимые процедуры, триггеры и определяемые пользователем функции. Чтобы вызвать хранимую процедуру, триггер или определяемую пользователем функцию, необходимо их зарегистрировать. Дополнительные сведения см. в статье о том, как зарегистрировать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB.
Примечание.
Этот урок посвящен хранимым процедурам, а следующий — триггерам и определяемым пользователем функциям.
Написание хранимых процедур
Хранимые процедуры могут создавать, обновлять, читать, запрашивать и удалять элементы в контейнере Azure Cosmos. Хранимые процедуры регистрируются в коллекциях и могут работать с любым документом и вложением, существующим в этой коллекции.
Давайте начнем с простой хранимой процедуры, которая возвращает ответ "Hello World".
var helloWorldStoredProc = {
id: "helloWorld",
serverScript: function () {
var context = getContext();
var response = context.getResponse();
response.setBody("Hello, World");
}
}
Объект контекста предоставляет доступ ко всем операциям, которые можно выполнять в Azure Cosmos DB, а также доступ к объектам запросов и ответов. В этом примере вы применяете объект ответа, чтобы задать текст ответа для отправки клиенту.
Создание элемента с помощью хранимой процедуры
При создании элемента с помощью хранимой процедуры элемент вставляется в контейнер Azure Cosmos DB и возвращается идентификатор только что созданного элемента. Создание элемента является асинхронной операцией и зависит от функций обратного вызова JavaScript. Функция обратного вызова имеет два параметра: один для объекта ошибки в случае сбоя операции, а другой — для возвращаемого значения, в данном случае созданный объект. Внутри функции обратного вызова можно либо обработать исключение, либо вызвать ошибку. Если обратный вызов не указан и возникает ошибка, среда выполнения Azure Cosmos DB выдает ошибку.
Хранимая процедура также включает параметр для задания описания в качестве логического значения. Если параметр имеет значение true, а описание отсутствует, хранимая процедура создает исключение. В противном случае остальная часть хранимой процедуры продолжит выполняться.
Эта хранимая процедура принимает в качестве входного параметра documentToCreate
, тело документа, который будет создан в текущей коллекции. Все эти операции являются асинхронными и зависят от функций обратных вызовов JavaScript.
var createDocumentStoredProc = {
id: "createMyDocument",
body: function createMyDocument(documentToCreate) {
var context = getContext();
var collection = context.getCollection();
var accepted = collection.createDocument(collection.getSelfLink(),
documentToCreate,
function (err, documentCreated) {
if (err) throw new Error('Error' + err.message);
context.getResponse().setBody(documentCreated.id)
});
if (!accepted) return;
}
}
Массивы в качестве входных параметров для хранимых процедур
При определении хранимой процедуры на портале Azure входные параметры всегда отправляются в хранимую процедуру в виде строки. Даже если передать массив строк в качестве входных данных, массив преобразуется в строку и отправляются в хранимую процедуру. Чтобы обойти эту проблему, можно определить функцию в хранимой процедуре для анализа строки как массива. В следующем коде показано, как проанализировать строковый входной параметр как массив.
function sample(arr) {
if (typeof arr === "string") arr = JSON.parse(arr);
arr.forEach(function(a) {
// do something here
console.log(a);
});
}
Ограниченное выполнение
Все операции Azure Cosmos DB должны завершить выполнение в течение ограниченного периода времени. Хранимые процедуры имеют ограниченное время выполнения на сервере. Все функции коллекции возвращают логическое значение, представляющее, завершается ли эта операция или нет
Транзакции в рамках хранимых процедур
Вы можете реализовать транзакции для элементов в контейнере с помощью хранимой процедуры. Функции JavaScript могут реализовать модель на основе продолжения для пакетной обработки или возобновления выполнения. Значение продолжения может быть любым по вашему выбору, и приложения могут использовать его для возобновления транзакции с новой начальной точки. На следующей схеме показано, как модель продолжения транзакций может использоваться для повторения серверной функции, пока функция не завершит всю рабочую нагрузку обработки.