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
40001e código OCCOC001quando interagem novamente com o armazenamento.Por exemplo, considere a seguinte sequência de ações:
-
Na sessão 1, um usuário adiciona uma coluna à tabela
mytable. Isso atualiza a versão do catálogo. -
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
CREATEeINSERT.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.