是否可以回滚Azure存储表事务,以便我不会丢失数据?

bhmjp9jg  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(112)

我是Azure云开发的新手。
我有一个用C#编写的函数应用程序:
1.从存储表中获取记录
1.删除该记录
1.更新该记录上的字段(包括分区键)
1.将新记录插入存储表
当在插入部分抛出异常时,我遇到数据丢失。
我想知道,如果步骤4引发异常,我如何回滚步骤2。如果这不可能,我如何防止数据丢失,因为我无法使用内置的表操作来替换实体,因为我正在更改分区键?
我知道所有这一切中最困难的部分是分区键更新,因为我知道系统被设计成每个事务或操作都在具有相同分区键的记录上操作。
我已经浏览了Table Service REST API,并查看了我认为可能有用的所有表操作:Insert Entity更新实体合并实体插入或更新实体插入或替换实体

4xy9mtcn

4xy9mtcn1#

由于分区键的原因,你不能进行事务处理,所以你必须在表存储之外寻找一个解决方案。
你可以做的是在删除记录之前先创建它,这样你就可以确保不会丢失任何数据(只要你确保创建记录的请求成功)。
你可以更进一步,把它变成一个异步进程,让一个存储队列或服务总线把包含请求信息的消息排队,让一个函数应用程序(或其他任何东西)处理请求,这样你就可以确保请求在更长的时间间隔内发生任何暂时性错误时仍然可以重试。

h4cxqtbf

h4cxqtbf2#

根据问题,我们能够重现数据丢失的问题。在表中,有下面突出显示的记录。x1c 0d1x
一旦插入发生异常,数据丢失,如问题

所述
要更新PartitionKey的值,CosmosDb不允许直接更新partitionkey的值。首先,我们需要删除记录,然后使用新的partitionkey值创建新记录。
为了使用内置TableOperations防止数据丢失,您可以在成功完成前面的步骤后执行/调用Execute()。

TableOperation delOperation = TableOperation.Delete(getBatchCustomer);

可以使用复制构造函数克隆或创建第一个对象的深层副本。

public Customer(Customer customer)
{
    PartitionKey = customer.PartitionKey;
    RowKey = customer.RowKey;
    customerName = customer.customerName;
}

正在创建对象的副本

Customer c = new(getCustomer)
{
    PartitionKey = "India"
};

在步骤4中提到的问题,由你成功完成,然后我们可以提交删除操作。
插入步骤出现异常

但是当查看数据表时没有数据丢失。

下面是代码片段,以防止数据丢失.

TableOperation _insOperation = TableOperation.Insert(c);
var insResult = _table.Execute(_insOperation);
if (insResult.HttpStatusCode == 204)
{
    var delResult = _table.Execute(delOperation);
}

相关问题