我的背景是作为一个PHP开发人员,所以我不太清楚如何处理这种竞争条件,我一直在使用Java servlet和hibernate框架遇到问题。使用Java防止竞争条件
基本上,我试图防止在后端双重提交付款请求。当付款请求到达时,我会检查客户当前付款状态的数据库。如果它是“UNPAID”,我将DB更新为“PROCESSING”,并在所有事情完成时继续处理付款,最后将其设置为“付费”。
但是,我相信hibernate没有运行我的数据库更新,直到会话关闭。这意味着如果在我的第一个付款请求完成处理之前发出第二个请求,它将再次处理付款请求。
在PHP中,我只是在付款页面被点击时检查并更新付款状态,我从来没有遇到任何与竞争条件有关的问题。但是,我以前使用的这种模式在我正在开发的Java环境中不起作用。
有没有人有过这样做的正确方法?
对此的答案将是复杂和广泛的计算器。如果你想防止数据库在脏的状态下读取数据,你应该使用数据库锁定系统。 –
你能不能提供一点信息?我对Java的经验非常有限,而且“数据库锁定系统”不是我之前遇到过的。 – user7862512
Servlets应该像每个请求都是单线程一样编写。使您的数据库以适当的隔离级别写入事务。它会工作。从JDBC教程开始:https://docs.oracle.com/javase/tutorial/jdbc/ – duffymo