在 Azure 表存储中,如何以原子方式进行“获取或插入”?

问题描述

我正在使用 C#、.NET 5.0 和 Microsoft.Azure.Cosmos.Table 1.0.8 版开发 C# Azure 应用程序。我想做以下事情:

  1. 在表存储中查找具有特定分区键和行键的行/实体。
  2. 如果存在,则返回实体。
  3. 如果不存在,则创建一个,将其存储在表存储中并返回。

我想以原子方式执行此操作以避免竞争条件(即,如果两个线程尝试同时执行此操作,我想保证它们返回相同的值并且只有一个实体存储在表存储中)。>

TableOperationInsertOrMergeInsertOrReplace,但它们似乎不是我想要的。据我所知,他们两个都更喜欢写的 last 值,这是我不想要的。我希望它保留写入的 first 值(以便所有并发线程将返回相同的值)。

我该怎么做?

提前致谢!

解决方法

AFAIK,不可能以原子方式完成您想要做的事情。您将需要执行 2 个操作。

您的第一个操作将是 Insert 操作(而不是 InsertOrMergeInsertOrReplace)。如果实体不存在,则创建该实体并返回新创建的实体。

如果实体存在于表中,您的插入操作将失败并出现 Conflict (409) 错误。您的应用程序代码将需要处理此错误并从表中读取实体并返回该实体。