

# 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:

**Erros de controle de simultaneidade**  
O Aurora DSQL exibirá um erro de violação de controle de simultaneidade se você executar uma transação enquanto outra transação atualiza um recurso. Por exemplo, considere a seguinte sequência de ações:  

1. Na sessão 1, um usuário adiciona uma coluna à tabela `mytable`.

1. Na sessão 2, um usuário tenta inserir uma linha em `mytable`. 

   O Aurora DSQL exibe o erro `SQL Error [40001]: ERROR: schema has been updated by another transaction, please retry: (OC001).`

**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).