View a markdown version of this page

Aurora DSQL 中的并发控制 - Amazon Aurora DSQL

Aurora DSQL 中的并发控制

并发可让多个会话同时访问和修改数据,而不会损害数据完整性和一致性。Aurora DSQL 在实施现代、无锁并发控制机制的同时提供 PostgreSQL 兼容性。它通过快照隔离来保持完全的 ACID 合规性,同时确保数据一致性和可靠性。

Aurora DSQL 的一个关键优势是其无锁架构,这消除了常见的数据库性能瓶颈。Aurora DSQL 可防止慢速事务阻塞其它操作,并消除死锁风险。这种方法使 Aurora DSQL 对于性能和可扩展性至关重要的高吞吐量应用程序特别有价值。

并发控制响应

Aurora DSQL 使用乐观并发控制(OCC),其工作原理与传统的基于锁的系统不同。OCC 不使用锁,而是在提交时评估冲突。Aurora DSQL 在检测到冲突时,会返回带有 SQLSTATE 代码 40001 的 PostgreSQL 序列化失败故障。响应消息包括标识冲突类型的 OCC 代码:

OC000:数据冲突

两个事务试图修改同一行。提交时间最早的事务成功,而冲突的事务则收到 OC000 响应:

ERROR: change conflicts with another transaction (OC000) (SQLSTATE 40001)
OC001:架构冲突

会话所缓存的架构目录已过期。Aurora DSQL 检测到自会话加载其缓存以来目录版本发生了更改,并且事务无法安全地重定基准到当前版本时,事务将收到 OC001 响应:

ERROR: schema has been updated by another transaction (OC001) (SQLSTATE 40001)

任何修改架构目录的操作都可能导致 OC001 响应,包括 CREATE TABLEALTER TABLE 等 DDL 语句,以及 GRANTREVOKE 语句。有关更多信息,请参阅 Aurora DSQL 中的 DDL 和分布式事务

设计应用程序以实施重试逻辑来处理这些响应。理想的设计模式是幂等的,尽可能将事务重试作为第一选择。建议采用的逻辑类似于标准 PostgreSQL 锁定超时或死锁情况下的中止和重试逻辑。然而,OCC 要求您的应用程序更频繁地实施此逻辑。

优化事务性能的准则

要优化性能,请尽量减少对单个键或小键范围的高度争用。要实现此目标,请按照以下准则设计架构,使其在集群键范围内分散更新:

  • 为表选择一个随机主键。

  • 避免使用会增加单个键争用的模式。即使在事务量增长的情况下,这种方法也能确保最佳性能。