我有一个Asp.Net页面,其中包含流程付款。管理员可以处理付款。可以有多个管理员。如果页面在2个浏览器中打开并且管理员点击处理付款,则向客户收取双倍付款。
我可以在我的按钮点击处理程序/控制器方法中进行检查,如果已经收取一次费用我们不应该收取费用。但是,这也不能完全阻止这个问题,因为如果他们同时点击流程付款,可能会再次导致问题。我该如何解决这个问题?
我应该使用lock / mutex吗?请建议解决此问题的最佳方法是什么,这样客户就不会受苦。
答案 0 :(得分:0)
使用一些会话管理技术来识别登录,或者我希望您在数据库中跟踪付款状态。
答案 1 :(得分:-1)
您真的应该让数据库以事务方式处理状态更改。如果将智能数据库处理与良好的业务逻辑相结合,那么您所描述的情况就不会出现。
标识'是否倾向于向付款状态实体添加ProcessingStatus
枚举属性?
这可能是:
public enum ProcessingStatus
{
NotProcessed,
Processing,
FinishedProcessing
}
避免锁定程序,而是依赖数据库来处理并发。
所以控制器/点击处理程序逻辑的高级概述是:
NotProcessed
,则将状态更新为Processing
。无需锁定您的程序,因为数据库事务将确保只有一个人/进程可以更改状态,并且您的业务逻辑将阻止重复付款。
作为进一步的改进,您可以将此逻辑移动到单独的服务层" (可以说,这种数据库/业务逻辑不应该驻留在你的控制器中)。