View a markdown version of this page

DDL e transações distribuídas no Aurora DSQL - Amazon Aurora DSQL

DDL e transações distribuídas no Aurora DSQL

A linguagem de definição de dados (DDL) se comporta de forma diferente no Aurora DSQL em comparação ao PostgreSQL. O Aurora DSQL apresenta uma camada de banco de dados multi-AZ distribuída e sem compartilhamento, criada com base em frotas de computação e armazenamento multilocatário. Como não existe um único nó de banco de dados primário ou líder, o catálogo do banco de dados é distribuído. Por isso, o Aurora DSQL gerencia as alterações do esquema de DDL como transações distribuídas.

Especificamente, a DDL se comporta de forma diferente no Aurora DSQL da seguinte forma:

Respostas de controle de concorrência

Como o catálogo do banco de dados é distribuído, o Aurora DSQL gerencia alterações de esquema DDL como transações distribuídas que atualizam a versão do catálogo. Sessões que possuem uma cópia em cache do catálogo em uma versão anterior podem receber uma resposta de controle de concorrência com código SQLSTATE 40001 e código OCC OC001 quando interagem novamente com o armazenamento.

Por exemplo, considere a seguinte sequência de ações:

  1. Na sessão 1, um usuário adiciona uma coluna à tabela mytable. Isso atualiza a versão do catálogo.

  2. Na sessão 2, um usuário tenta inserir uma linha em mytable. Esta sessão ainda possui a versão anterior do catálogo em cache.

    O Aurora DSQL retorna SQL Error [40001]: ERROR: schema has been updated by another transaction (OC001).

nota

Uma resposta OC001 também pode ocorrer quando a alteração de esquema já foi concluída antes do início da transação afetada. Os processadores de consulta do Aurora DSQL detectam alterações no catálogo de forma reativa durante a execução da consulta, portanto uma sessão que ficou inativa ainda pode estar operando com uma versão desatualizada do catálogo. Ao tentar novamente, a sessão atualiza o cache do catálogo e a transação normalmente é bem-sucedida.

DDL e DML na mesma transação

As transações no Aurora DSQL podem conter somente uma instrução de DDL e não podem ter instruções de DDL e DML. Essa restrição significa que não é possível criar uma tabela e inserir dados na mesma tabela dentro da mesma transação. Por exemplo, o Aurora DSQL é compatível aceita as transações sequenciais a seguir.

BEGIN; CREATE TABLE mytable (ID_col integer); COMMIT; BEGIN; INSERT into FOO VALUES (1); COMMIT;

O Aurora DSQL não aceita a transação a seguir, que inclui instruções CREATE e INSERT.

BEGIN; CREATE TABLE FOO (ID_col integer); INSERT into FOO VALUES (1); COMMIT;
DDL assíncrona

No PostgreSQL padrão, as operações de DDL, como CREATE INDEX, bloqueiam a tabela afetada, tornando-a indisponível para leituras e gravações de outras sessões. No Aurora DSQL, essas instruções de DDL são executadas de forma assíncrona usando um gerenciador em segundo plano. O acesso à tabela afetada não é bloqueado. Assim, a DDL em tabelas grandes pode ser executada sem tempo de inatividade ou impacto no desempenho. Para ter mais informações sobre o gerenciador de trabalhos assíncronos no Aurora DSQL, consulte Índices assíncronos no Aurora DSQL.