我有下一个问题 我有用户。用户在数据库中有列 - 票证。 - 门票是内部货币。 现在当用户点击网站购买 - 我去 webapi===> BL(类库)
我从 DB 获取用户 - 检查他是否有票,如果是 - 我按照我的逻辑(然后我去 DAL - 并放下这个计数器)。
问题是 - 如果我在网站上点击“购买”按钮——那么快——我可以购买两次。
示例
用户有1张票
他想买东西——1张票
用户快速点击 BUY 按钮 2 次
1 个请求 转到 WebApi ==> 转到 BL ==> Bl 从数据库中获取 DAL 用户并检查他是否有 Ticket --- 是的他有 ===> 做逻辑并将 Ticket 计数器设置为 0
2 个请求 转到 WebApi ==> 转到 BL ==> Bl 从数据库中获取 DAL 用户并检查他是否有 Ticket --- 是的他有 这里是问题 ===> 做逻辑并把售票柜台为0
所以我不知道如何防止这个错误......或者如何更好地为此重新制作数据库结构?
请您参考如下方法:
您需要以这样一种方式更改您的更新逻辑,即多个并发更新中只有一个会成功。
例如,如果您的数据库表有 TicketId 和 TicketCount 字段,您会看到您还有 n 票,并且您想减少票的数量,而不是这样做
UPDATE Ticket
SET TicketCount=@NewTicketCount
WHERE TicketId=@TicketId
这样做:
UPDATE Ticket
SET TicketCount=@NewTicketCount
WHERE TicketId=@TicketId AND TicketCount=@OldTicketCount
当您从多个线程同时运行第二个更新时,只有一个会成功,更新一行。所有其他线程都会看到此请求更新零行。他们应该将其视为失败的指示,并将相应的状态码返回给Web API的调用者。
I'm using EF 6.0
那你就靠EF 6 implementation of optimistic concurrency了,它会自动为您执行类似的操作。
