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 TABLE和ALTER TABLE等 DDL 语句,以及GRANT和REVOKE语句。有关更多信息,请参阅 Aurora DSQL 中的 DDL 和分布式事务。
设计应用程序以实施重试逻辑来处理这些响应。理想的设计模式是幂等的,尽可能将事务重试作为第一选择。建议采用的逻辑类似于标准 PostgreSQL 锁定超时或死锁情况下的中止和重试逻辑。然而,OCC 要求您的应用程序更频繁地实施此逻辑。
优化事务性能的准则
要优化性能,请尽量减少对单个键或小键范围的高度争用。要实现此目标,请按照以下准则设计架构,使其在集群键范围内分散更新:
-
为表选择一个随机主键。
-
避免使用会增加单个键争用的模式。即使在事务量增长的情况下,这种方法也能确保最佳性能。