0

我有一个Customer容器,其中包含代表单个客户的SQL API (DocumentDB)项目CosmosDB。我也有一个Gremlin API (GraphDB)与客户的shoppingcart数据。这两个数据都是临时的/暂时的。客户可以选择清除购物车,这将删除临时customershoppingcart数据。

目前,我进行单独的调用,其中一个SQL API (DocumentDB)有效Gremlin API (GraphDB),但我想将两者都作为事务进行(ACID 原则)。要删除customer,我调用Gremblin API并删除shoppingcart数据,然后调用SQL API删除customer。但是,如果使用(第二步)删除客户SQL API失败,我想回滚在第一次调用中所做的更改,这将回滚shoppingcart已删除的数据。在 T-SQL 世界中,这是通过 acommitrollback.

如何围绕和数据的删除操作实现分布式事务协调customershoppingcart

4

1 回答 1

1

由于您在 Cosmos DB 中没有跨不同集合的事务(仅在一个容器的分区内),因此这不可能直接实现。

下一个最好的办法是使用Change Feed。每当更改或插入项目时都会触发它。但是:它不会在删除时触发。所以你需要另一个“软删除”的小解决方法。基本上,您为该文档创建一个标志(“待删除”等)并很快将其 TTL 设置为某个值。这确实会触发然后更改提要,您可以从那里删除另一个集合中的项目。

这一切都比你现在拥有的更好吗?老实说,如果你问我,不是真的。

//更新:补充一点关于提交/回滚:这在 Cosmos DB 中也不存在。想到的一种可能的解决方法:

  1. 更新收藏购物车中的元素。设置一个标志并将这些元素的 TTL 设置为to-be-deleted类似truenow() + 5 minutes
  2. 删除集合中的元素customer。如果这行得通,一切都很好。
  3. 如果删除失败,请再次更新购物车。删除to-be-deleted标志并删除 TTL,这样 Comsos DB 就不会自动删除它。

当然,您还需要更新对购物车运行的任何查询,以排除任何带有删除标志的元素。

于 2019-07-28T19:37:30.223 回答