

# Aurora DSQL 中的并发控制
<a name="working-with-concurrency-control"></a>

并发可让多个会话同时访问和修改数据，而不会损害数据完整性和一致性。Aurora DSQL 在实施现代、无锁并发控制机制的同时提供 [PostgreSQL 兼容性](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/working-with-postgresql-compatibility.html)。它通过快照隔离来保持完全的 ACID 合规性，同时确保数据一致性和可靠性。

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

## 并发控制响应
<a name="dsql-transaction-conflicts"></a>

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 和分布式事务](working-with-ddl.md)。

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

## 优化事务性能的准则
<a name="dsql-perf-guidelines"></a>

要优化性能，请尽量减少对单个键或小键范围的高度争用。要实现此目标，请按照以下准则设计架构，使其在集群键范围内分散更新：
+ 为表选择一个随机主键。
+ 避免使用会增加单个键争用的模式。即使在事务量增长的情况下，这种方法也能确保最佳性能。