如何防止多次付款

时间:2014-10-14 10:23:13

标签: c# asp.net .net asp.net-mvc

我有一个Asp.Net页面,其中包含流程付款。管理员可以处理付款。可以有多个管理员。如果页面在2个浏览器中打开并且管理员点击处理付款,则向客户收取双倍付款。

我可以在我的按钮点击处理程序/控制器方法中进行检查,如果已经收取一次费用我们不应该收取费用。但是,这也不能完全阻止这个问题,因为如果他们同时点击流程付款,可能会再次导致问题。我该如何解决这个问题?

我应该使用lock / mutex吗?请建议解决此问题的最佳方法是什么,这样客户就不会受苦。

2 个答案:

答案 0 :(得分:0)

使用一些会话管理技术来识别登录,或者我希望您在数据库中跟踪付款状态。

  • 现在,添加一个接受位数据类型的列。
  • 当您遇到第一个事务时,将该位字段设为true。
  • 遇到事务时,请检查位字段是否为true。如果 这是真的还原用户自定义消息或booom更新您的数据库 并以成功的信息回复他。

答案 1 :(得分:-1)

您真的应该让数据库以事务方式处理状态更改。如果将智能数据库处理与良好的业务逻辑相结合,那么您所描述的情况就不会出现。

标识'是否倾向于向付款状态实体添加ProcessingStatus枚举属性?

这可能是:

public enum ProcessingStatus
{
    NotProcessed,
    Processing,
    FinishedProcessing
}

避免锁定程序,而是依赖数据库来处理并发。

所以控制器/点击处理程序逻辑的高级概述是:

  1. 启动数据库事务(具有可序列化的隔离级别)。
  2. 检索付款的当前状态。
  3. 如果NotProcessed,则将状态更新为Processing
  4. 提交交易。
  5. 如果4成功完成,则继续执行实际的付款交易。
  6. 如果4未成功完成,则回滚并让用户知道相应的消息。
  7. 无需锁定您的程序,因为数据库事务将确保只有一个人/进程可以更改状态,并且您的业务逻辑将阻止重复付款。

    作为进一步的改进,您可以将此逻辑移动到单独的服务层" (可以说,这种数据库/业务逻辑不应该驻留在你的控制器中)。