我不知道是否需要考虑使用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一个错误,指出“您无法执行更新操作”。
答案 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/中的“表服务中的并发管理”部分以了解更多详细信息。