Procedimentos armazenados, acionadores e funções definidas pelo utilizador

APLICA-SE A: NoSQL

O Azure Cosmos DB fornece uma execução transacional de linguagem integrada de JavaScript. Ao utilizar a API para NoSQL no Azure Cosmos DB, pode escrever procedimentos armazenados, acionadores e funções definidas pelo utilizador (UDFs) na linguagem JavaScript. Pode escrever a lógica em JavaScript, executada dentro do motor de base de dados. Pode criar e executar acionadores, procedimentos armazenados e UDFs com portal do Azure, a API de consulta integrada de linguagem JavaScript no Azure Cosmos DB ou os SDKs de cliente do Azure Cosmos DB para NoSQL.

Vantagens da utilização da programação do lado do servidor

Escrever procedimentos armazenados, acionadores e funções definidas pelo utilizador (UDFs) no JavaScript permite-lhe criar aplicações avançadas e estas têm as seguintes vantagens:

  • Lógica processual: JavaScript como uma linguagem de programação de alto nível que fornece interface avançada e familiar para expressar lógica de negócio. Pode executar uma sequência de operações complexas nos dados.

  • Transações atómicas: As operações de base de dados do Azure Cosmos DB executadas num único procedimento armazenado ou num acionador são atómicas. Esta funcionalidade atómica permite que uma aplicação combine operações relacionadas num único lote, para que todas as operações sejam bem-sucedidas ou nenhuma delas tenha êxito.

  • Desempenho: Os dados JSON são mapeados intrinsecamente para o sistema de tipo de linguagem JavaScript. Este mapeamento permite várias otimizações, como a materialização preguiçosa de documentos JSON no conjunto de memória intermédia e a disponibilização a pedido do código de execução. Existem outros benefícios de desempenho associados à mudança da lógica de negócio para a base de dados, que inclui:

    • Criação de lotes: Pode agrupar operações como inserções e submetê-las em massa. Os custos de latência de tráfego de rede e a sobrecarga do arquivo para criar transações separadas são significativamente reduzidos.

    • Pré-compilação: Os procedimentos armazenados, os acionadores e os UDFs são implicitamente pré-compilados no formato de código de byte para evitar o custo de compilação no momento da invocação de cada script. Devido à pré-compilação, a invocação dos procedimentos armazenados é rápida e tem pouca pegada.

    • Sequenciação: Por vezes, as operações precisam de um mecanismo de acionamento que possa efetuar uma ou mais atualizações aos dados. Além da Atomicidade, também existem benefícios de desempenho ao executar no lado do servidor.

  • Encapsulamento: Os procedimentos armazenados podem ser utilizados para agrupar a lógica num único local. O encapsulamento adiciona uma camada de abstração sobre os dados, o que lhe permite desenvolver as suas aplicações de forma independente dos dados. Esta camada de abstração é útil quando os dados são sem esquema e não tem de gerir a adição de lógica adicional diretamente à sua aplicação. A abstração permite-lhe manter os dados seguros ao simplificar o acesso a partir dos scripts.

Dica

Os procedimentos armazenados são mais adequados para operações que são pesadas em termos de escrita e exigem uma transação num valor de chave de partição. Ao decidir se deve utilizar procedimentos armazenados, otimize em torno da encapsulação da quantidade máxima de escritas possível. De um modo geral, os procedimentos armazenados não são os meios mais eficientes para realizar um grande número de operações de leitura ou consulta, pelo que a utilização de procedimentos armazenados para criar grandes quantidades de leituras para regressar ao cliente não produzirá o benefício desejado. Para um melhor desempenho, estas operações de leitura intensiva devem ser efetuadas no lado do cliente, com o SDK do Azure Cosmos DB.

Nota

As funcionalidades javaScript do lado do servidor, incluindo procedimentos armazenados, acionadores e funções definidas pelo utilizador, não suportam a importação de módulos.

Transações

A transação numa base de dados típica pode ser definida como uma sequência de operações executadas como uma única unidade lógica de trabalho. Cada transação fornece garantias de propriedade ACID. ACID é um acrónimo bem conhecido que significa: Umatomicity, Consistency, Isolation, and Durability.

  • A atomicidade garante que todas as operações efetuadas dentro de uma transação são tratadas como uma única unidade e todas são consolidadas ou nenhuma delas é.

  • A consistência garante que os dados estão sempre num estado válido entre transações.

  • O isolamento garante que não existem duas transações que interfiram entre si: muitos sistemas comerciais fornecem vários níveis de isolamento que podem ser utilizados com base nas necessidades da aplicação.

  • A durabilidade garante que qualquer alteração consolidada numa base de dados estará sempre presente.

No Azure Cosmos DB, o runtime javaScript está alojado dentro do motor de base de dados. Assim, os pedidos efetuados nos procedimentos armazenados e os acionadores são executados no mesmo âmbito que a sessão da base de dados. Esta funcionalidade permite ao Azure Cosmos DB garantir propriedades ACID para todas as operações que fazem parte de um procedimento armazenado ou de um acionador. Por exemplo, veja o artigo como implementar transações .

Dica

Para o suporte de transações no Azure Cosmos DB para NoSQL, também pode implementar um lote transacional com o seu SDK de cliente preferido. Para obter mais informações, veja Operações de lote transacional no Azure Cosmos DB para NoSQL.

Âmbito de uma transação

Os procedimentos armazenados estão associados a um contentor do Azure Cosmos DB e a execução de procedimentos armazenados está no âmbito de uma chave de partição lógica. Os procedimentos armazenados têm de incluir um valor de chave de partição lógica durante a execução que defina a partição lógica para o âmbito da transação. Para obter mais informações, veja o artigo criação de partições do Azure Cosmos DB .

Consolidar e reverter

As transações são integradas nativamente no modelo de programação JavaScript do Azure Cosmos DB. Numa função JavaScript, todas as operações são encapsuladas automaticamente numa única transação. Se a lógica JavaScript num procedimento armazenado for concluída sem exceções, todas as operações dentro da transação serão consolidadas na base de dados. Instruções como BEGIN TRANSACTION e COMMIT TRANSACTION (familiares a bases de dados relacionais) estão implícitas no Azure Cosmos DB. Se existirem exceções do script, o runtime JavaScript do Azure Cosmos DB reverterá toda a transação. Como tal, lançar uma exceção é efetivamente equivalente a uma ROLLBACK TRANSACTION no Azure Cosmos DB.

Consistência de dados

Os procedimentos armazenados e os acionadores são sempre executados na réplica primária de um contentor do Azure Cosmos DB. Esta funcionalidade garante que as leituras dos procedimentos armazenados oferecem uma consistência forte. As consultas que utilizam funções definidas pelo utilizador podem ser executadas na réplica primária ou secundária. Os procedimentos armazenados e os acionadores destinam-se a suportar escritas transacionais. Entretanto, a lógica só de leitura é melhor implementada como lógica do lado da aplicação e as consultas que utilizam os SDKs do Azure Cosmos DB para NoSQL irão ajudá-lo a saturar o débito da base de dados.

Dica

As consultas executadas dentro de um procedimento armazenado ou acionador podem não ver alterações aos itens efetuadas pela mesma transação de script. Esta instrução aplica-se tanto a consultas SQL, como getContent().getCollection.queryDocuments(), bem como a consultas de linguagem integradas, como getContext().getCollection().filter().

Execução vinculada

Todas as operações do Azure Cosmos DB têm de ser concluídas dentro do tempo limite especificado. Os procedimentos armazenados têm um limite de tempo limite de 5 segundos. Esta restrição aplica-se às funções JavaScript – procedimentos armazenados, acionadores e funções definidas pelo utilizador. Se uma operação não for concluída dentro desse limite de tempo, a transação será revertida.

Pode garantir que as suas funções JavaScript são concluídas dentro do limite de tempo ou implementar um modelo baseado em continuação na execução de batches/currículos. Para simplificar o desenvolvimento de procedimentos armazenados e acionadores para processar limites de tempo, todas as funções no contentor do Azure Cosmos DB (por exemplo, criar, ler, atualizar e eliminar itens) devolvem um valor booleano que representa se essa operação será concluída. Se este valor for falso, é uma indicação de que o procedimento tem de concluir a execução porque o script está a consumir mais tempo ou débito aprovisionado do que o valor configurado. As operações colocadas em fila antes da primeira operação de arquivo não aceite são garantidas para serem concluídas se o procedimento armazenado for concluído a tempo e não colocar mais pedidos em fila. Assim, as operações devem ser colocadas em fila uma de cada vez através da convenção de chamada de retorno do JavaScript para gerir o fluxo de controlo do script. Uma vez que os scripts são executados num ambiente do lado do servidor, são estritamente regidos. Os scripts que violam repetidamente os limites de execução podem ser marcados como inativos e não podem ser executados e devem ser recriados para respeitar os limites de execução.

As funções JavaScript também estão sujeitas à capacidade de débito aprovisionado. As funções JavaScript podem potencialmente acabar por utilizar um grande número de unidades de pedido num curto espaço de tempo e poderão ser limitadas se o limite de capacidade de débito aprovisionado for atingido. É importante ter em atenção que os scripts consomem débito adicional para além do débito gasto a executar operações de base de dados, embora estas operações de base de dados sejam ligeiramente menos dispendiosas do que executar as mesmas operações do cliente.

Acionadores

O Azure Cosmos DB suporta dois tipos de acionadores:

Pré-acionadores

O Azure Cosmos DB fornece acionadores que podem ser invocados ao executar uma operação num item do Azure Cosmos DB. Por exemplo, pode especificar um pré-acionador quando cria um item. Neste caso, o pré-acionador será executado antes da criação do item. Os pré-acionadores não podem ter parâmetros de entrada. Se necessário, pode ser utilizado o objeto de pedido para atualizar o corpo do documento no pedido original. Quando os acionadores são registados, os utilizadores podem especificar as operações com as quais estes podem ser executados. Se um acionador tiver sido criado com TriggerOperation.Create, significa que não será permitido utilizar o acionador numa operação de substituição. Por exemplo, veja o artigo Como escrever acionadores .

Pós-acionadores

Semelhantes aos pré-acionadores, os pós-acionadores também estão associados a uma operação num item do Azure Cosmos DB e não necessitam de parâmetros de entrada. São executadas após a conclusão da operação e têm acesso à mensagem de resposta que é enviada ao cliente. Por exemplo, veja o artigo Como escrever acionadores .

Nota

Os acionadores registados não são executados automaticamente quando ocorrem as operações correspondentes (criar/eliminar/substituir/atualizar). Têm de ser chamados quando estas operações estiverem em execução. Para saber mais, veja o artigo Como executar acionadores .

Funções definidas pelo utilizador

As funções definidas pelo utilizador (UDFs) são utilizadas para expandir a API para sintaxe de linguagem de consulta NoSQL e implementar facilmente lógica de negócio personalizada. Só podem ser chamadas em consultas. As UDFs não têm acesso ao objeto de contexto e destinam-se a ser utilizadas apenas como JavaScript de computação. Por conseguinte, os UDFs podem ser executados em réplicas secundárias.

API de consulta integrada em linguagem JavaScript

Além de emitir consultas com a API para sintaxe de consulta NoSQL, o SDK do lado do servidor permite-lhe executar consultas com uma interface JavaScript sem qualquer conhecimento do SQL. A API de consulta JavaScript permite-lhe criar consultas através de programação ao transmitir funções de predicado para a sequência de chamadas de função. As consultas são analisadas pelo runtime javaScript e são executadas de forma eficiente no Azure Cosmos DB. Para saber mais sobre o suporte da API de consulta JavaScript, veja o artigo Working with JavaScript language integrated query API (Trabalhar com a API de consulta integrada de linguagem JavaScript ). Para obter exemplos, veja o artigo How to write stored procedures and triggers using JavaScript Query API (Como escrever procedimentos armazenados e acionadores com a API de Consulta JavaScript ).

Passos seguintes

Saiba como escrever e utilizar procedimentos armazenados, acionadores e funções definidas pelo utilizador no Azure Cosmos DB com os seguintes artigos:

Está a tentar planear a capacidade de uma migração para o Azure Cosmos DB? Pode utilizar informações sobre o cluster de bases de dados existentes para o planeamento de capacidade.