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

时间:2018-11-19 22:38:58

标签: azure-table-storage etag

我不知道是否需要考虑使用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一个错误,指出“您无法执行更新操作”。

1 个答案:

答案 0 :(得分:0)

总而言之,ETag并非旨在手动设置。实际上,它是为 Read-Edit-Write 场景设计的,并防止由于并发操作导致的 Dirty Write

  • 如果从服务器查询中获取了变量element,则该变量已经包含来自服务器端的ETag,则无需像var result = Table.Execute(TableOperation.Retrieve<T>(partitionKey, rowKey))一样再次检索它。
  • 如果变量element是从客户端构造的,则从服务器端检索ETag并将其设置为element并没有多大意义。

请检查https://azure.microsoft.com/en-us/blog/managing-concurrency-in-microsoft-azure-storage-2/中的“表服务中的并发管理”部分以了解更多详细信息。