我的背景是作为PHP开发人员,所以我不太确定如何处理这种竞争条件我在使用Java servlet和hibernate框架时遇到了麻烦。
基本上,我试图阻止在后端双重提交付款请求。当付款请求进入时,我会检查数据库中客户的当前付款状态。如果它" UNPAID"我将DB更新为" PROCESSING"并继续处理付款,最后将其设置为" PAID"当一切都完成时。
但是,我认为hibernate在会话关闭之前不会运行我的数据库更新。这意味着如果在我的第一个付款请求完成处理之前第二个请求进入,它将再次处理付款请求。
在PHP中,我会在付款页面被点击后立即检查并更新付款状态,并且我从未遇到任何竞争条件问题。但是,我之前使用的这种模式并不适用于我正在开发的Java环境。
有没有人知道这样做的正确方法是什么?
答案 0 :(得分:1)
根据您的描述,我会说您的PHP代码隐藏了竞争条件,而您却没有意识到这一点。你需要从不同的角度解决这个问题。放弃你可以阻止双重提交的假设,而不是假设它们是不可避免的。一旦你意识到这是真的,你就可以建立一个合适的设计(这可能与你目前所拥有的设计有很大不同)。如果您可以发布您的架构和一些示例代码,我可能会提供一些建议。