我正在做一个项目,并且遇到了一种“设计问题”。我有一个代表“竞争”的实体。用户获得投票,他们对比赛进行投票。每个比赛有 10 个项目,每个项目总共只能投 10 票。当用户尝试使用他们的投票时,我会快速搜索他们尚未投票的公开比赛。
当我想到多个用户都在争夺同一个竞争时,问题就来了。我不在乎两个用户是否同时投票,但我想防止最近关闭比赛的错误,但仍有用户投票,因为他们在结束之前选择了......我认为投票即将结束时的“竞争条件”。
在我看来,只有几个选项:
选项 1:打开 READ_COMMITTED 事务,但我的理解是这会在读取时锁定行,因此在返回锁定之前不会完成其他查询。由于这是一个JSP应用程序,当JSP完成渲染时,读锁是否结束?似乎我仍然可能遇到同样的问题。
选项 2:写出有多少用户已经查看了比赛。不过,这似乎遵循 Database-as-IPC 反模式,我可以看到监控和维护计数在哪里充其量是棘手的。
选项3:不要担心。如果用户投票时间过长,那么只需抛出一个错误并让他们移动到下一个。
选项 4:严重依赖 AJAX,可能使用 Atmosphere 进行消息传递,以保持比赛页面上的实时投票计数。不确定您如何处理浏览器超时或用户只是在中间离开......也许是某种清理计时器?
现在我倾向于选项 4,因为从用户的角度来看,它似乎在易于实现和易于使用之间取得了很好的平衡,但我想确保我在这里没有遗漏任何角度。
其他人是如何处理类似情况的?