Azure service fabric 可靠的字典和事务提交
我在Reliable Dictionary中遇到了一个问题,我更新了一个特定条目,但没有提交事务。事务中止似乎不会重置更新的条目 按照我的逻辑,我必须检查一本可靠的字典中是否有几个座位。如果是,我将它们分配给订单。如果其中一个不可用,我最好中止事务,以确保先前分配的席位将回滚到其原始状态,因为我没有提交事务 我会做错什么吗 以下是我正在构建的代码:Azure service fabric 可靠的字典和事务提交,azure-service-fabric,Azure Service Fabric,我在Reliable Dictionary中遇到了一个问题,我更新了一个特定条目,但没有提交事务。事务中止似乎不会重置更新的条目 按照我的逻辑,我必须检查一本可靠的字典中是否有几个座位。如果是,我将它们分配给订单。如果其中一个不可用,我最好中止事务,以确保先前分配的席位将回滚到其原始状态,因为我没有提交事务 我会做错什么吗 以下是我正在构建的代码: var unavailableSeats = new List<string>(); u
var unavailableSeats = new List<string>();
using (var tx = StateManager.CreateTransaction())
{
foreach (var requestSeat in request.Seats)
{
var match = await dict.Value.TryGetValueAsync(tx, requestSeat.ToString(), LockMode.Update);
if (!match.HasValue)
{
response.SetError($"No Seat found matching the Seat Key: {requestSeat} provided.");
return response;
}
var seatEntry = match.Value;
if (seatEntry.IsAvailable())
{
seatEntry.AssignToOrder(request.OrderId, request.RequestId.ToString());
await dict.Value.SetAsync(tx, requestSeat.ToString(), seatEntry, TimeSpan.FromSeconds(4),
cancellationToken);
}
else
{
unavailableSeats.Add(requestSeat.ToString());
}
}
if (!unavailableSeats.Any())
{
await tx.CommitAsync();
response.Success = true;
response.RequestId = request.RequestId;
return response;
}
tx.Abort();
}
var unavailableSeats=新列表();
使用(var tx=StateManager.CreateTransaction())
{
foreach(request.Seats中的var requestSeat)
{
var match=wait dict.Value.TryGetValueAsync(tx,requestSeat.ToString(),LockMode.Update);
如果(!match.HasValue)
{
response.SetError($“未找到与座椅键匹配的座椅:{requestSeat}已提供”);
返回响应;
}
var seatEntry=匹配值;
if(seatEntry.IsAvailable())
{
seatEntry.AssignToOrder(request.OrderId,request.RequestId.ToString());
等待dict.Value.SetAsync(tx,requestSeat.ToString(),seatEntry,TimeSpan.FromSeconds(4),
取消令牌);
}
其他的
{
添加(requestSeat.ToString());
}
}
如果(!unavailableSeats.Any())
{
wait tx.CommitAsync();
回答:成功=正确;
response.RequestId=request.RequestId;
返回响应;
}
tx.Abort();
}
您正在修改存储在字典中的内存实体。在修改任何属性之前,需要创建对象的副本。这在一些地方有记录,但在本文的“常见陷阱”一节中有专门提到
而不是
var seatEntry=match.Value
做
var-seatEntry=new-SeatEntryType(match.Value)//假设复制构造函数你好,托德,我实际上试过了,然后又回到了这种方法,因为它也不起作用。我要再检查一遍。我在一个例子中下载的WebReferenceApp列出了这种方法,所以我尝试了。啊!我明白我的错误了。在内存对象更新后,我正在克隆条目。我应该先克隆然后修改它。更改代码行以解决此问题。