Azure cosmosdb 确保Cosmos db中SP中操作/事务的原子性

Azure cosmosdb 确保Cosmos db中SP中操作/事务的原子性,azure-cosmosdb,Azure Cosmosdb,我有两个不同的问题 场景1: 目前,我们正在遵循冲突前和冲突后查询检查的模式,以维护文档的状态。简言之 我们的SP有以下模式: 冲突前检查–检查文档A是否处于状态S1 创建具有传递关系的文档B(B依赖于a) 冲突后检查-检查文档A是否仍处于状态S1,如果未失败 问题 1.是否可以在冲突后检查之后但在提交事务之前更改文档A? 如果是,缓解这种情况的最佳方法是什么 场景2: 我们希望锁定文档以防止任何编辑或允许部分编辑 问题 cosmos db是否具有任何实现锁定的功能 我们可以利用触发器进行锁定吗

我有两个不同的问题

场景1: 目前,我们正在遵循冲突前和冲突后查询检查的模式,以维护文档的状态。简言之 我们的SP有以下模式:

  • 冲突前检查–检查文档A是否处于状态S1
  • 创建具有传递关系的文档B(B依赖于a)
  • 冲突后检查-检查文档A是否仍处于状态S1,如果未失败
  • 问题 1.是否可以在冲突后检查之后但在提交事务之前更改文档A? 如果是,缓解这种情况的最佳方法是什么

    场景2: 我们希望锁定文档以防止任何编辑或允许部分编辑

    问题

  • cosmos db是否具有任何实现锁定的功能
  • 我们可以利用触发器进行锁定吗?(解释如下)
  • 触发器作为锁 我们可以通过创建一个单独的锁文档来实现锁(因为所有类型的文档都只能有唯一的ID,所以每个文档都有一个锁)。 如果我们想更改/替换一个特定的文档,我们可以使用一个预触发器来执行和检查锁

    使用触发器进行锁定的优点/缺点是什么(也从性能角度看)? 上述场景1是否可以使用前置和后置触发器替换


    更确切地说,是在提交替换文档调用后触发,还是在该调用之前触发?

    两个问题的答案都可以在此处找到:

    场景1:

    虽然我没有尝试过,但对于第一个场景,我相信您可以在Cosmos DB中使用
    存储过程。假设两个文档都在同一分区中,则将文档A和B都传递给存储过程。在那里,您将创建文档B。一旦创建了文档B,您将检查A的状态。如果A未处于所需状态(S1),您将抛出异常并回滚整个事务

    场景2:


    因为这样的锁在Cosmos DB中不可用,但是您可以通过在Cosmos DB中使用
    乐观并发
    来实现。这是通过使用文档上的
    \u etag
    属性来实现的。乐观并发防止写入程序在多写入程序场景中意外覆盖另一个写入程序所做的更改

    两个问题的答案都可以在这里找到:

    场景1:

    虽然我没有尝试过,但对于第一个场景,我相信您可以在Cosmos DB中使用
    存储过程。假设两个文档都在同一分区中,则将文档A和B都传递给存储过程。在那里,您将创建文档B。一旦创建了文档B,您将检查A的状态。如果A未处于所需状态(S1),您将抛出异常并回滚整个事务

    场景2:


    因为这样的锁在Cosmos DB中不可用,但是您可以通过在Cosmos DB中使用
    乐观并发
    来实现。这是通过使用文档上的
    \u etag
    属性来实现的。乐观并发防止写入程序在多写入程序场景中意外覆盖另一个写入程序所做的更改

    如果我对S1的检查成功,然后文档A在提交整个事务之前更改为S2状态,会发生什么情况?我们评估了ETag,但认为它不是正确的解决方案。我们有长期运行操作的场景。一旦长时间运行的操作开始,我们不希望对一组文档进行任何/部分更改。在这种情况下,即使在启动长时间运行的操作时读取eTag,也无法阻止其他服务请求对这些文档集进行操作。这就是为什么我们需要一个锁构造。
    当我对S1的检查成功,然后在提交整个事务之前文档a更改为S2状态时会发生什么?
    -您可以在此时从存储过程中抛出一个错误,这应该会回滚事务。关于您的第二条评论,不幸的是,目前Cosmos DB中没有锁定功能。您可以在代码中以某种方式使用
    Lease Blob
    功能。有关详细信息,请参阅此页:。我们的团队不需要其他依赖项(Azure blob)。我想这就是触发器有用的地方。让我试试!!如果我对S1的检查成功,然后文档A在提交整个事务之前更改为S2状态,会发生什么情况?我们评估了ETag,但认为它不是正确的解决方案。我们有长期运行操作的场景。一旦长时间运行的操作开始,我们不希望对一组文档进行任何/部分更改。在这种情况下,即使在启动长时间运行的操作时读取eTag,也无法阻止其他服务请求对这些文档集进行操作。这就是为什么我们需要一个锁构造。
    当我对S1的检查成功,然后在提交整个事务之前文档a更改为S2状态时会发生什么?
    -您可以在此时从存储过程中抛出一个错误,这应该会回滚事务。关于您的第二条评论,不幸的是,目前Cosmos DB中没有锁定功能。您可以在代码中以某种方式使用
    Lease Blob
    功能。有关详细信息,请参阅此页:。我们的团队不需要其他依赖项(Azure blob)。我想这就是触发器有用的地方。让我试试!!