可靠的字典和事务提交

Reliable Dictionary and Transactions Commit

我在 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();
            }

您正在修改存储在字典中的内存实体。在修改任何 属性 之前,您需要复制该对象。这在几个地方都有记录,但在这篇文章 https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-work-with-reliable-collections 的常见陷阱部分中特别提到。

而不是

var seatEntry = match.Value

var seatEntry = new SeatEntryType(match.Value) // 假设复制构造函数