我的用例非常简单:我希望为多个用户提供增加计数器的可能性1.现在使用乐观并发策略,可能会发生两个用户同时尝试更新计数器的情况。抛出一个OptimisticLockException。如果我理解正确的话,如果我没有显式调用EntityManager#flush,那么OptimisticLockException会被包装到系统异常中。现在,当发生这种情况时,事务将被回滚。但是,如何才能完成事务的重试,直到它最终成功为止?由于我只想将计数器增加1,所以我不必处理合并这两个更新的问题。我只想绝对确保没有增量丢失,我也不想回到用户那里,让他再次执行增量。
答案 0 :(得分:0)
我假设您的用例只是并发访问或某种测试或展示的示例,对吧?
如果没有,您可以让数据库执行此操作,并使用建议的序列或将其封装在您自己的数据库脚本中,该脚本可供任意客户端使用。
如果是这样,那么它只是一个计数器或由查询或持久化实体完成的任何其他操作无关紧要 - 问题始终是相同的:至少2个不同的请求试图触发相同的更新,一个将失败。
所以你要做的就是为你的用例处理问题具体,并决定重新加载已更改的实体并从那里开始或实现泛型重试机制,它在相同的时间/尝试次数重试相同的语句/用例(如果没有它,你不应该这样做,因为它会严重损害你的应用程序)。如果您想使用现有的实施,请尝试使用Google RetryProxy
。