执行更新元素时是否需要考虑 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 = "*";
进一步阅读
我不知道是否需要考虑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 = "*";