我正在尝试向Azure表存储发送一批简单的插入操作,但似乎整个批处理事务无效,并且使用托管的azure存储客户端,如果存在单个,则ExecuteBatch方法本身会抛出异常将批处理插入到预先存在的记录中。 (使用2.0客户端):
public class SampleEntity : TableEntity
{
public SampleEntity(string partKey, string rowKey)
{
this.PartitionKey = partKey;
this.RowKey = rowKey;
}
}
var acct = CloudStorageAccount.DevelopmentStorageAccount;
var client = acct.CreateCloudTableClient();
var table = client.GetTableReference("SampleEntities");
var foo = new SampleEntity("partition1", "preexistingKey");
var bar = new SampleEntity("partition1", "newKey");
var batchOp = new TableBatchOperation();
batchOp.Add(TableOperation.Insert(foo));
batchOp.Add(TableOperation.Insert(bar));
var result = table.ExecuteBatch(batchOp); // throws exception: "0:The specified entity already exists."
通过使用InsertOrMerge可以避免批处理级异常,但是每个单独的操作响应都返回204,无论该特定操作是插入还是合并它。因此,客户端应用程序似乎无法保留其是否或集群中的其他节点插入记录的知识。不幸的是,在我目前的情况下,这种知识对于某些下游同步是必要的。
是否有一些配置或技术允许批量插入继续并返回每个项目的特定响应代码而不会引发一揽子异常?
答案 0 :(得分:1)
正如您所知,由于批处理是一种交易操作,因此您可以获得全有或全无的交易。批处理事务的一个有趣之处是您获得批处理中第一个失败实体的索引。因此,假设您尝试在批处理中插入100个实体,并且表中已存在第50个实体,批处理操作将为您提供失败实体的索引(在本例中为49)。
是否有一些配置或技术允许批量插入 在没有的情况下继续并返回每个项目的特定响应代码 抛出一揽子例外?
我不这么认为。一旦第一个实体失败,交易就会失败。它甚至不会尝试处理其他实体。
可能的解决方案(只是大声思考:))
如果我理解正确,您的关键要求是确定实体是否已插入或合并(或替换)。为此,该方法将从批处理中分离出失败的实体并单独处理它们。基于此,我可以想到两种方法: