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,对客户也是如此,这会非常慢。我们可以使用亲和键,但这只能确保同一公司内的实体存储在同一个点燃节点上,它可能无法正确使用索引。
最好的方法是什么?
有没有办法在删除记录时获取键值API以使用companyId上的索引? (请记住 companyId 不是员工和客户的主键?)
在单个交易中 - 即在 tx =ignite.transactions().txStart() 和 tx.commit() 之间 - 我 (1) 可以使用 SQL查询以使用 companyId=companyId2Delete(使用索引)获取客户和员工中的所有主键,(2) 将这些键临时保存在内存中,以及 (3) 使用 IgniteCache.removeAll(keys) 删除这些键?这会得到原子性 TRANSACTIONAL 的支持吗,因为我只使用 SQL 来查询而不是操作数据?如果另一个请求试图同时向公司添加员工,会发生什么情况?
我可以将 100% SQL 与 TRANSACTIONAL_SNAPSHOT 一起使用,并希望它能尽快推出测试版吗?
编辑。看起来 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)应该存在。
假设我们有 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,对客户也是如此,这会非常慢。我们可以使用亲和键,但这只能确保同一公司内的实体存储在同一个点燃节点上,它可能无法正确使用索引。
最好的方法是什么?
有没有办法在删除记录时获取键值API以使用companyId上的索引? (请记住 companyId 不是员工和客户的主键?)
在单个交易中 - 即在 tx =ignite.transactions().txStart() 和 tx.commit() 之间 - 我 (1) 可以使用 SQL查询以使用 companyId=companyId2Delete(使用索引)获取客户和员工中的所有主键,(2) 将这些键临时保存在内存中,以及 (3) 使用 IgniteCache.removeAll(keys) 删除这些键?这会得到原子性 TRANSACTIONAL 的支持吗,因为我只使用 SQL 来查询而不是操作数据?如果另一个请求试图同时向公司添加员工,会发生什么情况?
我可以将 100% SQL 与 TRANSACTIONAL_SNAPSHOT 一起使用,并希望它能尽快推出测试版吗?
编辑。看起来 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)应该存在。