【发布时间】:2019-04-22 08:18:40
【问题描述】:
我不知道是否需要考虑使用 ETag 来防止多个线程同时操作单个实体。 以下是我目前的实现:
public void UpdateElement(T element)
{
Exceptions.ThrowIfNull(element, "record");
var partitionKey = element.PartitionKey;
var rowKey = element.RowKey;
var result = Table.Execute(TableOperation.Retrieve<T>(partitionKey, rowKey));
if (result?.Result != null)
{
Table.Execute(TableOperation.Replace(element));
}
}
所以我在这里想要实现的是,线程 A 和线程 B 同时操作同一个实体,线程 A 首先更新了这个实体。当线程 B 试图更新它时,我们应该给线程 B 一个错误,说“你不能执行更新操作”。
【问题讨论】:
-
变量
element从何而来?如果它来自服务器查询,那么它已经包含 ETag,您不需要像var result = Table.Execute(TableOperation.Retrieve<T>(partitionKey, rowKey))那样再次检索实体。此外,如果element是从客户端构造的并且不是来自服务器查询,那么您上面的代码并没有真正按照您的期望检查 ETag,因为element不包含任何 ETag。 -
感谢您的回答!但我想知道我们应该为设置 Etag 提供哪个值。例如,我有两个线程,线程 A 和线程 B,它们都想更新现有元素 ELEMENT。在这种情况下,我们应该如何为 A&B 的操作设置 Etag?谢谢!