在 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 应用程序。我想执行以下操作:
- 在 table 存储中查找具有特定分区键和行键的 row/entity。
- 如果存在,则 return 实体。
- 如果不存在,则创建一个,将其存储在 table 存储中,然后 return 它。
我想以原子方式执行此操作以避免竞争条件(即,如果两个线程尝试同时执行此操作,我想保证它们 return 具有相同的值并且只有一个实体存储在table 存储)。
TableOperation有InsertOrMerge和InsertOrReplace,但好像不是什么我想。据我所知,他们两个都更喜欢写入的 last 值,这是我不想要的。我希望它保留写入的 first 值(以便所有并发线程将 return 相同的值)。
我该怎么做?
提前致谢!
AFAIK,不可能以原子方式完成您尝试做的事情。您将需要执行 2 个操作。
您的第一个操作将是 Insert
操作(而不是 InsertOrMerge
或 InsertOrReplace
)。如果该实体不存在,则会创建它,并且新创建的实体将 returned.
如果实体存在于 table 中,您的插入操作将失败并出现 Conflict (409)
错误。您的应用程序代码将需要处理此错误并从 table 和 return 实体中读取实体。
我正在使用 C#、.NET 5.0 和 Microsoft.Azure.Cosmos.Table 版本 1.0.8 开发 C# Azure 应用程序。我想执行以下操作:
- 在 table 存储中查找具有特定分区键和行键的 row/entity。
- 如果存在,则 return 实体。
- 如果不存在,则创建一个,将其存储在 table 存储中,然后 return 它。
我想以原子方式执行此操作以避免竞争条件(即,如果两个线程尝试同时执行此操作,我想保证它们 return 具有相同的值并且只有一个实体存储在table 存储)。
TableOperation有InsertOrMerge和InsertOrReplace,但好像不是什么我想。据我所知,他们两个都更喜欢写入的 last 值,这是我不想要的。我希望它保留写入的 first 值(以便所有并发线程将 return 相同的值)。
我该怎么做?
提前致谢!
AFAIK,不可能以原子方式完成您尝试做的事情。您将需要执行 2 个操作。
您的第一个操作将是 Insert
操作(而不是 InsertOrMerge
或 InsertOrReplace
)。如果该实体不存在,则会创建它,并且新创建的实体将 returned.
如果实体存在于 table 中,您的插入操作将失败并出现 Conflict (409)
错误。您的应用程序代码将需要处理此错误并从 table 和 return 实体中读取实体。