在 Azure Table 存储中,如何以原子方式执行 "get or insert"?

In Azure Table Storage, how to do "get or insert" atomically?

我正在使用 C#、.NET 5.0 和 Microsoft.Azure.Cosmos.Table 版本 1.0.8 开发 C# Azure 应用程序。我想执行以下操作:

  1. 在 table 存储中查找具有特定分区键和行键的 row/entity。
  2. 如果存在,则 return 实体。
  3. 如果不存在,则创建一个,将其存储在 table 存储中,然后 return 它。

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

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

我该怎么做?

提前致谢!

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

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

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