可靠的字典和事务提交
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) // 假设复制构造函数
我在 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) // 假设复制构造函数