apache ignite key-value API 可以使用索引删除带有事务的记录吗?

Can apache ignite key-value API use an index to delete records with a transaction?

假设我们有 3 个缓存的用例,分别称为公司、员工和客户。公司记录拥有多个员工记录和多个客户记录。员工有自己的主键和一个引用其所有者公司记录的外键 companyId。我们使用 ignite 在 Employee companyId 字段上放置索引,使用 SQL Create Index@QuerySqlField(index = true) 注释。客户缓存的设置方式与员工缓存的设置方式完全相同。

假设我们要删除公司,因此我们希望在单个事务中 运行 以下 SQL 语句以确保公司及其子记录被完全删除或完全不删除如果交易失败则删除(因此我们保持参照完整性)。

DELETE FROM companies where id=companyId2Delete;
DELETE FROM employees where companyId=companyId2Delete;
DELETE FROM customers where companyId=companyId2Delete;

因此我们需要在 ignite 的事务中执行此操作,因为多行 SQL 语句在 ignite 中不起作用。然而,对于使用 SQL 与 ignite 一起工作的事务,需要使用 atomicity=TRANSACTIONAL_SNAPSHOT 定义 3 个缓存(参见 here and here)。文档还说 TRANSACTIONAL_SNAPSHOT 处于测试版,不应用于生产。

如果我们只使用键值API,我们可以使用完全支持的原子性类型TRANSACTIONAL(参见here)。然而,从员工和客户中删除的 SQL 删除语句使用我们在 companyId 的每个缓存中创建的索引,因此删除是高效的。如果我们仅在事务中使用键值 API 删除这些记录,我看不到任何使用 companyId 索引的方式(它似乎只对 SQL 可用)。大概我们必须扫描整个员工 table,对客户也是如此,这会非常慢。我们可以使用亲和键,但这只能确保同一公司内的实体存储在同一个点燃节点上,它可能无法正确使用索引。

最好的方法是什么?

编辑。看起来 ignite 正在删除多版本并发控制 (MVCC),请参阅 here and here. MVCC is the functionality that powers TRANSACTIONAL_SNAPSHOT (see here)。因此,在我看来,ignite 将放弃对 SQL.

交易的支持

不幸的是,现在无法使用缓存 API 操作中的 SQL 索引,也无法在缓存 API 事务中执行 SQL 查询。

关于 MVCC 删除,看起来它仅适用于 2.x 代。 Ignite 中的 AFAIK 3.x 这个特性(MVCC 事务,SQL 与缓存共享索引 API)应该存在。