关于JPA中高并发实体和竞争条件的思考......交易?

时间:2012-08-30 00:38:10

标签: jpa jpa-2.0 transactional spring-transactions

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

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

我看到它的方式,只有几个选项:

选项1:打开READ_COMMITTED事务,但我的理解是这会在读取时锁定行,因此在返回锁定之前不会完成其他任何查询。由于这是一个JSP应用程序,因此当JSP完成呈现时,读取锁定是否结束?好像我仍然可以遇到同样的问题。

选项2:写出有多少用户查看了竞争对手。这似乎遵循Database-as-IPC反模式,我可以看到监控和维护计数的位置最多也是棘手的。

选项3:不要担心。如果用户投票时间过长,则只需抛出错误并将其移至下一个错误。

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

现在我依赖于选项4,因为从用户的角度来看,它似乎在易于实现和易用性之间取得了很好的平衡,但我想确保我不会错过任何角度

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

1 个答案:

答案 0 :(得分:1)

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