群集环境上的并发事务问题

时间:2014-10-16 06:52:05

标签: java concurrency transactions jvm optimistic-locking

我遇到了在群集环境中运行的Web应用程序中的一个场景。

我们有2个节点(都有JVM)

  1. Node1
  2. 节点2
  3. 我在我的应用程序中运行一个数据库事务,其中读取了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上运行。

    我想知道下一步该做什么?任何帮助都很受欢迎。

1 个答案:

答案 0 :(得分:1)

如果你不能像许多评论所暗示的那样在数据库中控制它,你的下一个选择是实现某种形式的简单版本。

一种方法是将更新语句更改为:

update some_table set sequence = nextsequence where sequence = [sequence you just read];

然后看看有多少记录被更新(PreparedStatement' executeUpdate()将为您提供此值)。如果结果是0,那么你的进程的另一个实例击败你,所以你以某种方式处理它(抛出和错误,选择另一个序列号,......)