

# Aurora Serverless v2、预置集群与 Aurora Serverless v1 集群的 Amazon RDS 数据 API 行为比较
<a name="data-api.differences"></a>

Amazon RDS 数据 API 的最新增强功能，使得数据 API 可用于使用最新版本 PostgreSQL 或 MySQL 引擎的集群。这些集群可以配置为使用 Aurora Serverless v2 或预置实例类，例如 `db.r6g` 或 `db.r6i`。

以下部分描述了在 Aurora Serverless v2、预置数据库集群和 Aurora Serverless v1 数据库集群上 Amazon RDS 数据 API 的区别。Aurora Serverless v1数据库集群使用 `serverless` 引擎模式。预置数据库集群使用 `provisioned` 引擎模式。Aurora Serverless v2 数据库集群还使用 `provisioned` 引擎模式，并包含一个或多个使用 `db.serverless` 实例类的 Aurora Serverless v2 数据库实例。

## 每秒最大请求数
<a name="data-api.differences-requests"></a>

**Aurora Serverless v1**

数据 API 每秒最多可以发出 1000 个请求。

**Aurora Serverless v2**

数据 API 每秒可以发出的请求数量没有限制。

## 在现有数据库上启用或禁用 Amazon RDS 数据 API
<a name="data-api.differences-enable-disable"></a>

**Aurora Serverless v1**
+ **使用 Amazon RDS API**– 使用 `ModifyCluster` 操作，并为 `EnableHttpEndpoint` 参数指定 `True` 或 `False`（如果适用）。
+ **使用 AWS CLI** – 使用带有 `--enable-http-endpoint` 或 `--no-enable-http-endpoint` 选项的 `modify-db-cluster` 操作（如果适用）。

**Aurora Serverless v2**
+ **使用 Amazon RDS API** – 使用 `EnableHttpEndpoint` 和 `DisableHttpEndpoint` 操作。
+ **使用 AWS CLI**：使用 `enable-http-endpoint` 和 `disable-http-endpoint` 操作。

## CloudTrail 事件
<a name="data-api.differences-ct-events"></a>

**Aurora Serverless v1**

来自数据 API 调用的事件是管理事件。默认情况下，这些事件会自动包含在跟踪记录中。有关更多信息，请参阅 [从 AWS CloudTrail 跟踪记录中排除数据 API 事件（仅限 Aurora Serverless v1）](logging-using-cloudtrail-data-api.md#logging-using-cloudtrail-data-api.excluding-cloudtrail-events)。

**Aurora Serverless v2**

来自数据 API 调用的事件是数据事件。默认情况下，这些事件会自动排除在跟踪记录之外。有关更多信息，请参阅 [在 AWS CloudTrail 跟踪记录中包含数据 API 事件](logging-using-cloudtrail-data-api.md#logging-using-cloudtrail-data-api.including-cloudtrail-events)。

## 多语句支持
<a name="data-api.differences-multistatement"></a>

**Aurora Serverless v1**
+ 对于 Aurora MySQL，不支持多语句。
+ 对于 Aurora PostgreSQL，多语句仅返回第一个查询响应。

**Aurora Serverless v2**

不支持多语句。尝试在单个 API 调用中执行多条语句会返回 `“An error occurred (ValidationException) when calling the ExecuteStatement operation: Multistatements aren't supported.”`。要执行多条语句，请使用单独的 `ExecuteStatement` API 调用或使用 `BatchExecuteStatement` API 进行批处理。

以下示例显示了 API 调用在尝试执行多条语句时产生的错误消息。

```
 aws rds-data execute-statement \    
    --resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \    
    --secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \    
    --database "your_database" \
    --sql "SELECT * FROM your_table; Select * FROM next_table;
                                
                                "An error occurred (ValidationException) when calling the ExecuteStatement operation: Multistatements aren't supported.
```

以下示例使用单独 `ExecuteStatement` API 调用执行多条语句。

```
aws rds-data execute-statement \
    --resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \
    --secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \
    --database "your_database" \
    --sql "SELECT * FROM your_table;"

aws rds-data execute-statement \
    --resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \
    --secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \
    --database "your_database" \
    --sql "SELECT * FROM next_table;"
```

## 对于同一事务 ID 的并发请求
<a name="data-api.differences-concurrent-requests-transaction"></a>

**Aurora Serverless v1**

后续请求将等到当前请求完成。如果等待时间过长，应用程序需要处理超时错误。

**Aurora Serverless v2**

数据 API 收到多个具有相同事务 ID 的请求时，会立即返回以下错误：

`DatabaseErrorException: Transaction is still running a query`

此错误会在两种情况下发生：
+ 您的应用程序使用相同的事务 ID 发出异步请求（如 JavaScript promise）。
+ 之前使用相同事务 ID 的请求仍在处理中。

以下示例显示与 `promise.all()` 并行执行的所有请求。

```
const api_calls = [];
for (let i = 0; i < 10; i++) {
api_calls.push(
    client.send(
    new ExecuteStatementCommand({
        ...params,
        sql: `insert into table_name values (i);`,
        transactionId
    })
    )
);
}
await Promise.all(api_calls);
```

要解决此错误，请等待当前请求完成，然后再发送具有相同事务 ID 的另一个请求，或者删除事务 ID 以允许并行请求。

以下示例显示的 API 调用使用了具有相同事务 ID 的顺序执行。

```
 for (let i = 0; i < 10; i++) {
    await client.send(
    new ExecuteStatementCommand({
        ...params,
        sql: `insert into table_name values (i);`,
        transactionId
    })
    ).promise()
);
}
```

## BatchExecuteStatement 行为
<a name="data-api.differences-batchExecuteStatement"></a>

有关 `BatchExecuteStatement` 的更多信息，请参阅 [BatchExecuteStatement](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_BatchExecuteStatement.html)。

**Aurora Serverless v1**

更新结果中生成的字段对象包括插入的值。

**Aurora Serverless v2**
+ 对于 Aurora MySQL，更新结果中生成的字段对象包括插入的值。
+ 对于 Aurora PostgreSQL，生成的字段对象为空。

## ExecuteSQL 行为
<a name="data-api.differences-ExecuteSQL"></a>

有关 `ExecuteSQL` 的更多信息，请参阅 [ExecuteSQL](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_ExecuteSql.html)。

**Aurora Serverless v1**

`ExecuteSQL` 操作已弃用。

**Aurora Serverless v2**

不支持 `ExecuteSQL` 操作。

## ExecuteStatement 行为
<a name="data-api.differences-ExecuteStatement"></a>

有关 `ExecuteStatement` 的更多信息，请参阅 [ExecuteStatement](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_ExecuteStatement.html)。

**Aurora Serverless v1**

`ExecuteStatement` 参数支持检索多维数组列和所有高级数据类型。

**Aurora Serverless v2**

`ExecuteStatement` 参数不支持多维数组列。它也不支持某些 PostgreSQL 数据类型，包括几何类型和货币类型。数据 API 在遇到不支持的数据类型时，会返回以下错误：`UnsupportedResultException: The result contains the unsupported data type data_type`。

要解决此问题，请将不支持的数据类型强制转换为 `TEXT`。以下示例将不支持的数据类型转换为 `TEXT`。

```
SELECT custom_type::TEXT FROM my_table;-- 
ORSELECT CAST(custom_type AS TEXT) FROM my_table;
```

有关各个 Aurora 数据库引擎支持的数据类型的列表，请参阅[数据 API 操作参考](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api-operations)。

## Schema 参数行为
<a name="data-api.differences-schema-parameter"></a>

**Aurora Serverless v1**

不支持 `Schema` 参数。当您在 API 调用中时包含 `Schema` 参数时，数据 API 会忽略该参数。

**Aurora Serverless v2**

`Schema` 参数已弃用。当您在 API 调用中时包含 `Schema` 参数时，数据 API 会返回以下错误：`ValidationException: The schema parameter isn't supported`。以下示例显示返回 `ValidationException` 错误的数据 API 调用。

```
aws rds-data execute-statement \
--resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \
--secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \
--database "your_database" \
--schema "your_schema" \
--sql "SELECT * FROM your_table LIMIT 10"
```

要解决此问题，请删除 API 调用中的 `Schema` 参数。

以下示例显示删除了 `Schema` 参数的数据 API 调用。

```
aws rds-data execute-statement \   
--resource-arn "arn:aws:rds:region:account:cluster:cluster-name" \    
--secret-arn "arn:aws:secretsmanager:region:account:secret:secret-name" \    
--database "your_database" \    
--sql "SELECT * FROM your_table LIMIT 10"
```