执行更新元素时​​是否需要考虑 Azure Table 存储中的 Etag?

Do I need to consider Etag in Azure Table Storage when performing Update element?

我不知道是否需要考虑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 一个错误,说“你不能执行更新操作”。

ETag 不是为手动设置而设计的。相反,它专为 Read-Edit-Write 场景而设计,并防止由于并发操作而导致的 Dirty Write

  • 如果变量element是从服务器查询中获取的,它已经包含来自服务器端的ETag,你不需要像[=一样再次检索它14=]

  • 如果变量 element 是从客户端构造的,从服务器端检索 ETag 并将其设置为 element 没有多大意义。

  • 显式禁用并发检查,您应该在执行之前将 ETag 属性 设置为通配符 (*)替换操作。即

    customer.ETag = "*";
    

进一步阅读