【问题标题】:Thoughts on high-concurrent entities and race conditions in JPA...Transactional?关于 JPA 中的高并发实体和竞争条件的思考......事务性?
【发布时间】:2012-08-30 00:38:09
【问题描述】:

我正在处理一个项目,并且遇到了某种“设计问题”。我有一个代表“竞争”的实体。用户获得投票,他们对比赛进行投票。每个比赛有 10 个项目,每个项目总共只能投 10 票。当用户尝试使用他们的投票时,我会快速搜索他们尚未投票的公开比赛。

当我想到多个用户都在争夺同一个竞争时,问题就来了。我不在乎两个用户是否同时投票,但我想防止最近关闭比赛的错误,但仍有用户投票,因为他们在关闭之前选择了......我认为投票即将结束时的“竞争条件”。

在我看来,只有几个选项:

选项 1:打开 READ_COMMITTED 事务,但我的理解是这会在读取时锁定行,因此在返回锁定之前不会完成其他查询。由于这是一个JSP应用程序,当JSP完成渲染时,读锁是否结束?看来我还是有同样的问题。

选项 2:写出有多少用户参加了比赛。不过,这似乎遵循 Database-as-IPC 反模式,而且我可以看到监控和维护计数在哪里充其量是棘手的。

选项 3:不要担心。如果用户投票时间过长,那么只需抛出一个错误并让他们移动到下一个。

选项 4:大量依赖 AJAX,可能使用 Atmosphere 进行消息传递,以保持比赛页面上的实时投票计数。不确定您如何处理浏览器超时或用户只是在中间离开......也许是某种清理计时器?

现在我倾向于选项 4,因为从用户的角度来看,它似乎在易于实施和易于使用之间取得了很好的平衡,但我想确保我没有遗漏任何角度.

其他人是如何处理类似情况的?

【问题讨论】:

    标签: jpa jpa-2.0 transactional spring-transactions


    【解决方案1】:

    您可以考虑使用乐观或悲观锁定。这是解决并发问题的常规方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2015-09-10
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多