Spring Data R2DBC对接Google Spanner能否使用只读事务?
Spring Data R2DBC对接Google Spanner使用只读事务的可行性说明
核心结论
- 完全可以在对应业务场景下使用Spanner R2DBC驱动提供的只读事务能力
- 由于该特性不属于R2DBC标准规范定义的内容,无法通过Spring Data R2DBC内置的标准事务抽象直接触发,需要做针对性的定制对接
实现逻辑说明
- Spring Data R2DBC的内置事务抽象完全基于R2DBC标准API实现,默认仅支持标准读写事务的创建,没有内置Spanner专属只读事务的配置入口,这也是官方文档未提及该特性的核心原因
- 要启用只读事务,不需要完全脱离Spring的体系:可以自定义扩展
R2dbcTransactionManager,在创建底层连接事务时,直接调用Spanner驱动提供的原生只读事务创建方法,把只读参数透传给驱动层即可 - 也可以直接在业务代码中获取底层Spanner连接实例,手动创建只读事务上下文,把所有查询操作绑定到该上下文执行,操作完成后按驱动语义释放事务资源
落地注意事项
- Spanner原生只读事务全程不涉及加锁,基于数据库快照执行一致性读,相比标准读写事务可以显著降低资源开销、提升查询类负载的可扩展性
- 只读事务的快照时间戳会在首次执行查询时固定,事务后续的所有查询都基于该时间点的快照返回结果,不会感知到事务存续期间的新写入数据,业务侧需要对齐该语义避免逻辑偏差
- 自定义实现事务能力时,要对齐驱动原生的只读事务生命周期,不要对只读事务执行多余的提交操作,避免触发驱动层的异常
- 对于需要跨多次查询复用同一个一致性快照的场景,可以直接利用Spanner只读事务的快照复用能力,避免重复计算快照带来的开销
内容的提问来源于stack exchange,提问作者Kamil Roman
相关产品推荐
相关产品推荐

