【发布时间】:2016-11-12 11:30:42
【问题描述】:
我用 Java Servlet 实现了一个 Web 服务。
我得到了以下设置: 有一个处理“工作”条目的数据库。每个作业都有一个状态,如“正在执行”或“队列中”或“已完成”。如果用户开始一项新工作,则会在数据库中创建一个包含工作且状态为“队列中”的条目。
仅当已执行的其他作业少于五个时才应执行该作业。如果有五个其他人已经在执行,则状态需要保持“排队”,Cronjob 将在稍后处理此作业的执行。
现在我只是想知道,如果当前执行的作业少于五个,我的脚本将执行此作业。但是,如果同时,在我的脚本询问数据库正在执行多少作业和脚本开始执行作业之间,来自另一个用户的另一个请求创建了一个作业,并且由于数据库。
然后会有一个竞争条件,将执行 6 个作业。
我怎样才能防止这样的事情发生? 有什么建议吗?非常非常感谢!
【问题讨论】:
-
所以您没有使用 EJB(或者可能是 Spring)作为服务层?那些有内置的设施。这至少不是 servlet 的职责(它只是控制 HTTP 请求/响应)。
-
@BalusC 遗憾的是,我对整个 Java Servlets 编程非常陌生。我只有一个 Servlet,它从用户那里获取添加作业的请求。如果空闲槽可用,此 Sevlet 也会执行作业。
-
你的流程不清楚。你说的是“脚本”。它是什么?作业执行者和作业创建者在同一个应用程序中?
-
@davidhxxx 抱歉用错了词。我只有一个 Servlet,当用户创建“作业”时会调用它。如果有可用的空闲槽,则同一个 Servlet 会执行“作业”。
-
@progNewbie,没问题。现在很清楚了:)
标签: java servlets race-condition