2017-06-29 76 views
-2

我的背景是作为一个PHP开发人员,所以我不太清楚如何处理这种竞争条件,我一直在使用Java servlet和hibernate框架遇到问题。使用Java防止竞争条件

基本上,我试图防止在后端双重提交付款请求。当付款请求到达时,我会检查客户当前付款状态的数据库。如果它是“UNPAID”,我将DB更新为“PROCESSING”,并在所有事情完成时继续处理付款,最后将其设置为“付费”。

但是,我相信hibernate没有运行我的数据库更新,直到会话关闭。这意味着如果在我的第一个付款请求完成处理之前发出第二个请求,它将再次处理付款请求。

在PHP中,我只是在付款页面被点击时检查并更新付款状态,我从来没有遇到任何与竞争条件有关的问题。但是,我以前使用的这种模式在我正在开发的Java环境中不起作用。

有没有人有过这样做的正确方法?

+0

对此的答案将是复杂和广泛的计算器。如果你想防止数据库在脏的状态下读取数据,你应该使用数据库锁定系统。 –

+0

你能不能提供一点信息?我对Java的经验非常有限,而且“数据库锁定系统”不是我之前遇到过的。 – user7862512

+0

Servlets应该像每个请求都是单线程一样编写。使您的数据库以适当的隔离级别写入事务。它会工作。从JDBC教程开始:https://docs.oracle.com/javase/tutorial/jdbc/ – duffymo

回答

1

根据你的描述,我会说你的PHP代码有隐藏的竞争条件,你只是没有意识到它。你需要从另一个角度解决这个问题。放弃假设,你可以防止双重提交,而不是假设他们不可避免的。一旦你意识到这是真的,你可以建立一个合适的设计(这可能会比你目前有很多不同)。如果您可以发布您的架构和一些示例代码,我可能会提供一些建议。