

# DDL e transações distribuídas no Aurora DSQL
<a name="working-with-ddl"></a>

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.

1. 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)`.
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](working-with-create-index-async.md).