Transações ACID distribuídas e com vários documentos agora estão disponíveis no Couchbase como parte da linguagem de consulta N1QL.
Apresentação do Couchbase Transações ACID em sua versão 6.5 com os SDKs do Couchbase, e isso agora foi estendido para o Couchbase N1QL Query Service em a versão 7.0.
Couchbase A Couchbase, Inc., oferece suporte a transações ACID de vários documentos para sua plataforma de banco de dados distribuído, que são escalonáveis horizontalmente e também suportam alta disponibilidade. Esse recurso está disponível para os desenvolvedores de aplicativos por meio do Couchbase SDK e das APIs. As APIs permitem que os desenvolvedores façam modificações seguras nos documentos do banco de dados dentro de uma transação e, em seguida, confirmem ou revertam todas as alterações na transação, dependendo da lógica do aplicativo.
As transações do Couchbase funcionam em qualquer lugar: em nós, documentos, buckets, escopos e coleções. O processo de transações garante que somente os dados confirmados possam ser lidos por outros processos e lida automaticamente com o bloqueio e a detecção de conflitos.
A versão 7.0 amplia o suporte a transações distribuídas para a linguagem de consulta N1QL.
Para usuários de bancos de dados relacionais (RDBMS), esse aprimoramento do N1QL fornece construções transacionais familiares, como INICIAR TRANSAÇÃO
, SAVEPOINT
, ROLLBACK
e COMPROMISSO
. As transações N1QL também são compatíveis com todas as linguagens de manipulação de dados (DML), o que está de acordo com outras implementações de RDBMS.
Os benefícios das transações N1QL
Os principais benefícios de trazer o suporte a transações distribuídas para a linguagem de consulta N1QL incluem:
- Um ambiente mais seguro para a manipulação ad hoc de dados, permitindo que os desenvolvedores e DBAs modifiquem os dados e verifiquem sua exatidão antes de confirmar as alterações no banco de dados.
- Uma maneira simples de conceituar o processo que permite que os desenvolvedores validem a lógica antes de incorporar as operações ao código do aplicativo.
- A funcionalidade completa da N1QL Data Manipulation Language (selecionar/inserir/atualizar/excluir/fazer fusão), permitindo operações em vários documentos ao mesmo tempo.
- Compatibilidade total com o SDK do Couchbase, permitindo que os aplicativos incluam o Data Service e a API de consulta N1QL na mesma transação.
As transações N1QL permitem que todos os itens acima ocorram. Ao mesmo tempo, as transações N1QL mantêm a integridade dos dados, garantindo que as alterações incompletas sejam isoladas e não sejam confirmadas no banco de dados até que a transação seja concluída ou em caso de falha imprevista do sistema.
Transações ACID do Couchbase com N1QL
O recurso de transações N1QL foi desenvolvido com base na estrutura atual de transações ACID do Couchbase e, portanto, ofereceu a mesma garantias de conformidade total com ACID.
Atomicidade | A semântica tudo-ou-nada para dar suporte à atualização de vários documentos em vários fragmentos ou nós agora se estende à atomicidade em nível de declaração. Por exemplo, um ATUALIZAÇÃO que qualifica 100 documentos deve conseguir atualizar todos os documentos ou reverter. Atualizações parciais não ocorrerão. |
Consistência | A estrutura de transações do Couchbase fornece o mais alto nível de consistência para o serviço de dados, ou seja, as réplicas são imediatamente consistentes com o commit da transação.
Para o N1QL não transacional, a opção de consistência de varredura permanece a mesma de antes: ela suporta |
Isolamento | O isolamento N1QL suporta LER COMPROMETIDO para todos os leitores, independentemente de a leitura estar em uma transação ou não. |
Durabilidade | Embora a estrutura de transações do Couchbase ofereça suporte a todos os três níveis de durabilidade, as transações N1QL via não-SDK (WebUI/cbq/RestAPI) terão como padrão a opção "Majority".
Consulte a documentação do Couchbase para obter informações sobre mais detalhes sobre durabilidade. |
Escalabilidade horizontal e transações N1QL
Como em qualquer serviço do Couchbase, a escalabilidade horizontal é um requisito fundamental.
Todo o processamento das transações N1QL começa no Query Service, e a escalabilidade horizontal é obtida por meio do seguinte:
Não há gerenciamento central de transações: Todas as tarefas e despesas gerais da transação são executadas e mantidas no Query Service. De fato, o gerenciamento de transações é distribuído entre diferentes Query Services e, portanto, não tem um ponto central de falha.
Volume e tamanho das transações: O tamanho da transação, que atualmente é limitado apenas pelos recursos disponíveis para o Query Service, é ampliado de acordo com a complexidade da transação. Assim, a transação pode ser ampliada rapidamente com nós adicionais do Query Service.
O diagrama acima destaca os seguintes pontos:
- As consultas N1QL não transacionais são atendidas por qualquer dos serviços de consulta disponíveis. O Query Service selecionado pelo SDK é determinado pelo
ns_servidor
e, normalmente, é percorrido por ciclos usando uma abordagem round-robin. - Para uma transação N1QL executada sob o contexto de transação que as bibliotecas do Couchbase Transactions fornecem, todas as operações DML subsequentes (identificadas com
txid
) são direcionados para o mesmo nó de consulta, até que a transação seja confirmada ou revertida. Isso está disponível em Java SDK 1.1.3 - A afinidade entre os nós do SDK e da consulta é gerenciada automaticamente pelos SDKs.
- As transações do Couchbase oferecem suporte a operações DML de valor-chave e do Query Service por meio da biblioteca de transações Java do Couchbase. Você também pode acessar outros serviços, como o Full-Text Search e o Analytics, com solicitações de consistência de varredura que honram a confirmação na transação.
Onde você pode usar as transações N1QL
O recurso de transações N1QL é compatível com qualquer lugar em que você use uma consulta N1QL.
O principal requisito é que um txid
que é retornado do valor INICIAR TRANSAÇÃO
é usado com todas as DMLs N1QL subsequentes se elas fizerem parte da transação. O mesmo vale para o comando final COMPROMISSO
ou ROLLBACK
.
Se você estiver usando o Query Workbench e o cbq shell, passar txid
é gerenciado de forma transparente. Você não precisa realizar nenhuma ação explícita.
Shell CBQ
Aqui está um exemplo de uma transação N1QL usando o shell cbq:
1 2 3 4 5 6 7 8 |
cbq> \CONJUNTO -consulta_contexto "default:`travel-sample`._default" cbq> INICIAR TRANSAÇÃO; cbq> SELECIONAR CONTAGEM(*) DE aeroporto ONDE cidade="Stanted; cbq> ATUALIZAÇÃO aeroporto CONJUNTO cidade="Londres ONDE faa="STN; cbq> SAVEPOINT s1; cbq> DELETE DE aeroporto ONDE cidade="Londres E faa != "STN; cbq> ROLLBACK TRANSAÇÃO PARA SAVEPOINT s1; cbq> COMPROMISSO TRANSAÇÃO; |
API REST DO N1QL
Quando uma transação é iniciada, o shell cbq estabelece uma sessão com um Query Service específico e garante que todas as DMLs N1QL subsequentes sejam enviadas com o txid
(retornado com TRANSAÇÃO
) para o mesmo serviço de consulta.
Com a API REST, você precisa fornecer o valor do parâmetro txid
com DMLs subsequentes. Por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
>enrolar -u Administrador:senha http://localhost:8093/query/service -H "Content-Type: application/json" -d '{"statement": "START TRANSACTION", "pretty":true, "txtimeout": "2m", "scan_consistency": "request_plus", "durability_level": "majority", "durability_timeout": "2s"}' { "requestID": "34d585a7-3c4a-4f0e-8cd3-d3ffa7df0bb3", "assinatura": "json", "resultados": [ { "txid": "d81d9b4a-b758-4f98-b007-87ba262d3a51" } ], "status": "sucesso", "métricas": { "elapsedTime" (tempo decorrido): "4.196083ms", "executionTime": "4.12112ms", "resultCount": 1, "resultSize": 62, "serviceLoad": 0 } } >enrolar -u Administrador:senha http://localhost:8093/query/service -H 'Content-Type: application/json' -d ' {"declaração":"Declaração SQL", "bonita":verdadeiro,"txid":"d81d9b4a-b758-4f98-b007-87ba262d3a51"}' |
Configuração implícita da transação
Como parte das transações N1QL, há também a configuração implícita da transação: tximplicit
.
Em suma, quando isso é definido como verdadeiro, todas as DMLs N1QL subsequentes são executadas como se estivessem agrupadas entre um INICIAR TRANSAÇÃO
e um TRANSAÇÃO DE CONFIRMAÇÃO
. Essa configuração significa que você pode usar todos os aprimoramentos do N1QL que fazem parte do recurso de transações N1QL.
Durabilidade
Atualmente, o N1QL não transacional não oferece suporte a nenhuma configuração de durabilidade. Todas as mutações via N1QL usam durabilidade=nenhuma
. Com tximplicit
definido, o N1QL DML obtém a durabilidade
Implicações: Este tximplicit
permite definir indiretamente a durabilidade, mas você deve esperar uma latência adicional.
Consistência de varredura
A consistência da varredura N1QL não transacional é definida no SDK para qualquer nível exigido pelo aplicativo. (Consulte os documentos sobre desempenho e consistência para obter mais informações.)
No entanto, com tximplicit
definido, a DML é executada com consistência de varredura como request_plus
.
Implicações: Com essa configuração, a latência da consulta pode aumentar. Isso ocorre porque o DML precisa garantir que todos os índices dependentes sejam atualizados com o mesmo registro de data e hora da consulta.
Uso de recursos
O Query Service requer recursos de memória para processar a consulta, especialmente para operações de agregação e classificação.
Para DMLs não transacionais, todas as mutações têm efeito imediato. Para DMLs transacionais, todas as mutações em uma transação são mantidas localmente no Query Service até o momento do commit. Por esse motivo, o uso de recursos de memória é muito maior para a extensão da transação.
Implicações: As mutações das transações N1QL aumentam o uso da memória.
Diretrizes para quando (e quando não) usar transações N1QL
Com a introdução das transações N1QL, é importante ter em mente algumas diretrizes sobre quando (e quando não) usar esse novo recurso em seu aplicativo.
A regra geral é usar transações N1QL somente quando for necessário. O serviço de consulta do Couchbase foi projetado para fornecer alta taxa de transferência e baixa latência, sendo que ambas são afetadas pelas transações. Isso se deve aos requisitos e custos subsequentes em termos de durabilidade, consistência de varredura e uso de recursos.
Você também deve manter o tamanho da transação pequeno em termos do número de documentos e operações afetados pelas mutações. E, por fim, não recomendamos o uso de transações N1QL para casos de uso de mutação de grande volume.
Recursos adicionais sobre as transações N1QL
Faça o download do Couchbase Server 7.0 hoje mesmo