DynamoDB ResourceInUseException
TL;DR — 你对一张已经存在或仍在转换中(CREATING / UPDATING / DELETING)的表尝试了一个表操作。先检查表的状态,或者通过忽略"已经存在"来让创建具有幂等性。
含义
ResourceInUseException: Table already exists: <name>
ResourceInUseException: Attempt to change a resource which is still in use: Table is being created/deleted
# what the engine actually returns, reproduced against DynamoDB Local:
ResourceInUseException: Cannot create preexisting table控制平面操作(CreateTable、DeleteTable、UpdateTable)要求表处于一个兼容的状态。这个错误意味着它不是——要么它已经存在,要么它正处于转换中,DynamoDB 在它稳定到 ACTIVE 之前不会接受另一个操作。DynamoDB 以 HTTP 状态码 400 返回它,且原样不可重试——重试同样的请求会一直失败,直到状态改变(等待转换完成,或更改请求)。
为什么会发生
- 对一张已经存在的表重新运行
CreateTable(重复的迁移/部署、不清理的测试)。 - 在转换期间操作——在表仍处于
CREATING/UPDATING时创建索引、删除或更新。 - 一次竞速——两个进程并发创建同一张表。
如何修复
- 在操作之前检查状态。
DescribeTable→ 只有当TableStatus为ACTIVE时才继续;使用一个等待器(waitUntilTableExists)阻塞直到它稳定。 - 让创建具有幂等性。 在
CreateTable上捕获ResourceInUseException并把它当作成功(你想要的表存在)。 - 在测试/迁移中串行化表操作,使得两个不会同时运行;在拆除时清理测试表。
示例
import {DynamoDBClient, CreateTableCommand, ResourceInUseException} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({});
try {
await client.send(new CreateTableCommand(tableDef));
} catch (err) {
if (!(err instanceof ResourceInUseException)) throw err;
// Table already exists — that's fine, carry on.
}常见问题
ResourceInUseException 在 DynamoDB 中意味着什么?
控制平面操作(CreateTable、DeleteTable、UpdateTable)针对已存在或仍在通过 CREATING、UPDATING 或 DELETING 进行转换的表。在表稳定为 ACTIVE 之前,DynamoDB 不会接受其他操作。
如何使 CreateTable 幂等?
捕获 ResourceInUseException 并将其视为成功 — 你想要的表存在。或者首先检查DescribeTable,并且仅在桌子不存在时创建,使用像waitUntilTableExists这样的服务员来阻塞,直到它解决。
DynoTable 中的路径
当迁移重新运行 CreateTable 时,DynoTable 会立即显示该表存在 — 使用 ⌘K 打开它 → 在脚本中按名称打开表
重试。打开选项卡上的 表设置 显示 TableStatus(CREATING,
UPDATING、ACTIVE),这样你就可以等待ACTIVE,然后再发出下一个控制平面的变化。对于本地迭代,将本地配置文件指向
http://localhost:8000 (Running DynamoDB Local) 和使用DynamoDB JSON converter在表稳定后加载种子项。对于停留在 UPDATING 的云表,表设置 还会列出正在运行的 GSI
回填 — 在每个索引上等待 ACTIVE,然后再进行下一个 UpdateTable
你的部署脚本。针对DynamoDB Local,测试时会出现相同的ResourceInUseException
针对从未清除的内存实例重新运行 CreateTable — treat
本地(如云)并捕获错误或等待 ACTIVE。
相关错误
- ResourceNotFoundException——表不存在。
- ThrottlingException——控制平面操作过多。
- 学习:DynamoDB migrations
来源
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide(2026-07-13 验证)
- CreateTable — Amazon DynamoDB API Reference(2026-07-13 验证)
- UpdateTable — Amazon DynamoDB API Reference(2026-07-13 验证)
- DeleteTable — Amazon DynamoDB API Reference(2026-07-13 验证)