我有一个端点,该端点将某些实体称为POST,称为Entry。这些条目具有一个名为OrderNumber的属性,该属性是一个1-n的数字,该数字基于今天已经发生的条目确定。因此,当数据库中当天有100个条目时,新的OrderNumber应该为101。
那么当您从不同的设备(X和Y)两次击中端点时会发生什么:
X。发送条目
X。向数据库询问当前条目->回复100
Y。发送条目
Y。向数据库询问当前条目->回复100
X。记录将插入OrderNumber 101
Y。记录将插入OrderNumber 101
我的解决方案是创建一个具有队列的后台任务(如此处https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#queued-background-tasks所示)并在其中创建条目,以确保它们被依次处理。
现在控制器中的问题是,我无法在请求期间返回带有正确的OrderNumber的最新条目,因为只要队列处理了该条目,它就会发生。
那么客户端如何正确获得响应?还是有更好/不同的方式来处理这些情况?
答案 0 :(得分:0)
此处的自定义属性代码:
public class SingleThreadAttribute : ActionFilterAttribute
{
private static Object _thisLock = new Object();
public override void OnActionExecuting(ActionExecutingContext context)
{
Monitor.Enter(_thisLock);
base.OnActionExecuting(context);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
Monitor.Exit(_thisLock);
}
}
通过在控制器的操作端点上添加[SingleThread]
属性,如果同时进行多个调用,则它们将在等待上一个调用释放锁的同时被处理。
这可以解决您的情况。
答案 1 :(得分:0)
我刚刚找到了这个stackoverflow答案,似乎可以解决我的问题:
How to protect resources that may be used in a multi-threaded or async environment?