Azure service fabric 可靠的字典和事务提交

Azure service fabric 可靠的字典和事务提交,azure-service-fabric,Azure Service Fabric,我在Reliable Dictionary中遇到了一个问题,我更新了一个特定条目,但没有提交事务。事务中止似乎不会重置更新的条目 按照我的逻辑,我必须检查一本可靠的字典中是否有几个座位。如果是,我将它们分配给订单。如果其中一个不可用,我最好中止事务,以确保先前分配的席位将回滚到其原始状态,因为我没有提交事务 我会做错什么吗 以下是我正在构建的代码: var unavailableSeats = new List<string>(); u

我在Reliable Dictionary中遇到了一个问题,我更新了一个特定条目,但没有提交事务。事务中止似乎不会重置更新的条目

按照我的逻辑,我必须检查一本可靠的字典中是否有几个座位。如果是,我将它们分配给订单。如果其中一个不可用,我最好中止事务,以确保先前分配的席位将回滚到其原始状态,因为我没有提交事务

我会做错什么吗

以下是我正在构建的代码:

            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列出了这种方法,所以我尝试了。啊!我明白我的错误了。在内存对象更新后,我正在克隆条目。我应该先克隆然后修改它。更改代码行以解决此问题。