6

假设我有:

using (TransactionScope scope = new TransactionScope()) 
{
    if (IndexExists(index.RowKey))
        DeleteIndex(index.RowKey); //deletes using TableOperation.Delete

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    CloudTable table = tableClient.GetTableReference(Const.IndexTable);

    TableOperation insertOperation = TableOperation.Insert(index);
    table.Execute(insertOperation);   
}

我想要的是:如果插入失败,删除应该被撤消。这是正确的交易方式吗?一切都发生在同一个分区/表中。还有事务的其他限制是什么,我在某处读到事务中可以存储不超过 4 Mb,这仍然正确吗?

4

1 回答 1

12

假设需要对其执行操作的所有实体都具有相同的 PartitionKey,您可以利用Entity Group TransactionWindows Azure 表存储中提供的功能。它正是这样做的。如果在事务中对实体的操作失败,则回滚整个事务。

但是,您似乎正在删除一个实体并再次创建相同的实体。该场景不适用于实体批处理事务,因为实体在事务中只能出现一次,并且只能对实体执行一个操作。看起来您感兴趣的是替换实体。在这种情况下,您可以直接使用InsertOrReplace()功能。

于 2013-03-09T09:56:57.797 回答