如何关闭Cloud Spanner读写事务重试机制?Java Spring Boot求助
解决Spanner读写事务重试机制无法关闭的问题
你之前的配置只修改了executeSql的重试设置,但读写事务的自动重试(比如遇到ABORTED错误时的重试)是由提交阶段的配置控制的,所以只改executeSqlSettings不生效。以下是正确的配置方式:
核心原因
Spanner Java客户端对读写事务的重试逻辑,主要触发在事务提交阶段——当收到ABORTED状态码时,客户端会自动重新执行整个事务lambda。这个行为受commitSettings的重试配置约束,而非executeSqlSettings。
修改后的代码
import com.google.cloud.spanner.Spanner; import com.google.cloud.spanner.SpannerOptions; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.DatabaseId; import com.google.api.gax.retrying.RetrySettings; import org.threeten.bp.Duration; // My Bean/Class Definition code here // 定义无重试配置:最多1次尝试,完全禁用重试 RetrySettings noRetrySettings = RetrySettings.newBuilder() .setMaxAttempts(1) .setTotalTimeout(Duration.ofSeconds(15)) // 设置合理超时,避免无限阻塞 .build(); // 构建SpannerOptions,覆盖事务相关的重试配置 SpannerOptions options = SpannerOptions.newBuilder() .getSpannerStubSettingsBuilder() // 关键:关闭提交阶段的重试,事务ABORT后的重试由这个控制 .commitSettings() .setRetrySettings(noRetrySettings) // 关闭开始事务的重试 .beginTransactionSettings() .setRetrySettings(noRetrySettings) // 如果事务内有执行独立SQL,也可以关闭其重试 .executeSqlSettings() .setRetrySettings(noRetrySettings) .build(); // 创建客户端 Spanner spanner = options.getService(); DatabaseId db = DatabaseId.of("my-project-id", "my-instance-id", "my-database-id"); DatabaseClient dbClient = spanner.getDatabaseClient(db); // 执行读写事务,此时不会自动重试 dbClient.readWriteTransaction().run(transaction -> { // My transaction logic here return null; });
额外说明
- 确认你使用的
google-cloud-spanner客户端版本不低于1.40.0(较新版本均支持上述配置) - 设置
TotalTimeout是为了避免请求挂起时无限等待,你可以根据业务场景调整时长 - 如果需要针对单个事务而非全局关闭重试,也可以通过
TransactionRunner的自定义选项实现,但全局配置更适配你的需求
内容的提问来源于stack exchange,提问作者Shailendra Singh
相关产品推荐
相关产品推荐

