

# Aurora DSQL 中的 DDL 和分布式事务
<a name="working-with-ddl"></a>

数据定义语言（DDL）在 Aurora DSQL 中的行为与在 PostgreSQL 中不同。Aurora DSQL 具有一个多可用区分布式和无共享数据库层，该数据库层在多租户计算和存储实例集的基础之上构建。由于不存在单个主数据库节点或中心节点，因此数据库目录是分布式的。这样，Aurora DSQL 将 DDL 架构更改作为分布式事务进行管理。

具体而言，DDL 在 Aurora DSQL 中的行为有所不同，如下所示：

**并发控制错误**  
如果您运行一个事务，而另一个事务更新资源，则 Aurora DSQL 会返回并发控制违规错误。例如，请考虑以下操作序列：  

1. 在会话 1 中，用户向表 `mytable` 中添加一列。

1. 在会话 2 中，用户尝试向 `mytable` 中插入一行。

   Aurora DSQL 返回错误 `SQL Error [40001]: ERROR: schema has been updated by another transaction, please retry: (OC001).`

**DDL 和 DML 在同一个事务中**  
Aurora DSQL 中的事务只能包含一个 DDL 语句，而不能同时拥有 DDL 和 DML 语句。此限制意味着您无法在同一个事务中创建表并将数据插入到同一个表中。例如，Aurora DSQL 支持以下顺序事务。  

```
BEGIN;
  CREATE TABLE mytable (ID_col integer);
COMMIT;

BEGIN;
  INSERT into FOO VALUES (1);
COMMIT;
```
Aurora DSQL 不支持以下事务，其中同时包括 `CREATE` 和 `INSERT` 语句。  

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

**异步 DDL**  
在标准 PostgreSQL 中，诸如 `CREATE INDEX` 之类的 DDL 操作会锁定受影响的表，使其不可用于从其它会话中读取和写入。在 Aurora DSQL 中，这些 DDL 语句使用后台管理器异步运行。对受影响表的访问不受阻止。因此，大型表上的 DDL 可以在不停机或不影响性能的情况下运行。有关 Aurora DSQL 中异步作业管理器的更多信息，请参阅 [Aurora DSQL 中的异步索引](working-with-create-index-async.md)。