Apache Ignite ATOMIC模式下查询结果是否具备隔离性?
Ignite Lazy SqlFieldsQuery 与 ATOMIC 缓存的数据隔离问题
核心结论
默认情况下,使用lazy模式的SqlFieldsQuery在ATOMIC缓存上执行时,查询结果并不与主数据集完全隔离。
原因解析
- ATOMIC缓存仅保证单操作的原子性,不提供事务级别的快照隔离能力。
- Lazy查询采用流式分页机制,初始阶段会确定扫描的分区和键范围(比如基于索引或全表扫描生成的初始扫描计划),后续分页请求是基于这个初始计划渐进式获取数据。即使并行删除了查询范围内的键,已经被纳入扫描队列的条目仍会被返回——因为扫描过程不会实时同步后续的数据删除操作。
- 归约节点接收分页数据时,不会主动校验这些键是否仍存在于缓存中,只会返回数据节点传递过来的结果。
可行解决方案
- 改用TRANSACTIONAL缓存一致性级别,同时在查询前开启事务。事务的快照隔离特性会保证查询基于事务开始时的数据集状态,后续的数据修改不会影响查询结果。
- 在SqlFieldsQuery的SQL语句中添加显式的存在性校验,比如
WHERE EXISTS (SELECT 1 FROM my_cache WHERE _key = t._key),但这会增加额外的性能开销。 - 调整业务逻辑,避免在查询执行期间修改查询范围内的数据,或等待查询完全执行完毕后再进行删除操作。
内容的提问来源于stack exchange,提问作者Anton Shkrunin
相关产品推荐
相关产品推荐

