我遇到了在群集环境中运行的Web应用程序中的一个场景。
我们有2个节点(都有JVM)
我在我的应用程序中运行一个数据库事务,其中读取了sequence_no,稍后我们将其加1,如
select sequence from some_table;
nextsequence = sequence + 1; // incrementing sequence
update some_table set sequence = nextsequence; // set the next sequence
现在发生了什么请求转到Node1并且它递增序列号。但是由于node1上的outofmemoryerror错误而被缓慢地提交到数据库(需要1分钟)。同时另一个请求转到Node2并取消序列号。从数据库并更新它。所以这两个请求都得到了相同的序列,我们不会这样,因为我们想要唯一的序列号。对于所有的要求。
我们无法同步事务,因为它无法帮助,因为它在不同的JVM上运行。
我想知道下一步该做什么?任何帮助都很受欢迎。
答案 0 :(得分:1)
如果你不能像许多评论所暗示的那样在数据库中控制它,你的下一个选择是实现某种形式的简单版本。
一种方法是将更新语句更改为:
update some_table set sequence = nextsequence where sequence = [sequence you just read];
然后看看有多少记录被更新(PreparedStatement' executeUpdate()将为您提供此值)。如果结果是0,那么你的进程的另一个实例击败你,所以你以某种方式处理它(抛出和错误,选择另一个序列号,......)