本页面介绍了如何在 Spanner 中使用可重复读隔离级别。
可重复读是一种隔离级别,可确保事务内的所有读取操作看到的都是事务开始时数据库的一致快照。在 Spanner 中,此隔离级别是通过一种也常被称为快照隔离的技术实现的。在高读写并发场景中,许多事务读取的数据可能正在被其他事务修改,这种方法在该场景非常有用。通过使用固定的快照,可重复读可避免更严格的串行化隔离级别带来的性能影响。读取操作无需获取锁即可执行,也不会阻塞并发写入,这可能会减少因串行化冲突而需要重试的中止事务数量。如需了解详情,请参阅隔离级别概览。
设置隔离级别
您可以使用以下方法在数据库客户端级或事务级设置读写事务的隔离级别:
客户端库
Go
Java
Node.js
Python
REST
您可以使用 TransactionOptions.isolation_level REST API 在事务级设置读写事务和只读事务的隔离级别。有效选项包括 TransactionOptions.SERIALIZABLE 和 TransactionOptions.REPEATABLE_READ。默认情况下,Spanner 会将隔离级别设置为串行化隔离。
限制
可重复读隔离预览版存在以下限制。
- 如果您的架构具有检查约束,您可能会遇到问题。
- 存在一个已知问题,会导致无法验证检查约束,从而在事务提交时导致违反约束。因此,如果您的架构具有检查约束,我们不建议在预览版中使用可重复读隔离。
- 如果在事务执行期间数据库中发生并发的架构更改,您可能会遇到问题。
- 如果您的 DML 语句使用
last_statement选项,并且在 DML 语句执行期间发生并发架构更改,则该语句可能会在内部重试,并返回一条错误,指出在设置last_statement选项后,DML 重试不正确。在应用架构更改后重试事务可解决此问题。 - 如果事务中的请求遇到来自客户端的
DEADLINE_EXCEEDED错误,请在应用架构更改后重试事务以解决问题。
- 如果您的 DML 语句使用
不受支持的应用场景
- 您无法为分区 DML 事务设置可重复读隔离级别。
- 所有只读事务都以固定快照运行,不需要获取锁,因此在此事务类型中设置可重复读隔离不会改变任何行为。
- 您无法使用 Spanner 客户端库为只读、单次使用和分区操作设置可重复读隔离级别。Spanner 客户端库将无法为只读、单次使用和分区查询操作设置可重复读隔离级别。
后续步骤
详细了解隔离级别。
如需详细了解 Spanner 串行化和外部一致性,请参阅 TrueTime 和外部一致性。