java - 集群环境下的并发事务问题

标签 java concurrency transactions jvm optimistic-locking

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

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

  1. 节点1
  2. 节点2

我正在我的应用程序中运行一个数据库事务,其中读取了sequence_no,然后我们将其加1,如

select sequence from some_table;

nextsequence = sequence + 1; // incrementing sequence 

update some_table set sequence = nextsequence;  // set the next sequence

现在发生了什么请求转到 Node1 并增加序列号。但由于节点 1 上出现内存不足错误,提交到数据库的速度很慢(需要 1 分钟)。与此同时,另一个请求发送到 Node2 并获取序列号。从数据库中获取并更新它。因此,两个请求都有相同的序列,但我们不会这样做,因为我们想要唯一的序列号。对于所有的请求。

我们无法同步事务,因为它在不同的 JVM 上运行,因此没有帮助。

我想知道下一步该做什么?非常感谢任何帮助。

最佳答案

如果您无法像许多评论所建议的那样在数据库中控制这一点,那么您的下一个选择是实现某种形式的简单版本控制。

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

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

然后查看更新了多少条记录(例如,PreparedStatement 的executeUpdate() 将为您提供该值)。如果结果是 0,那么进程的另一个实例会抢先一步,因此您以某种方式处理它(抛出错误,选择另一个序列号,...)

关于java - 集群环境下的并发事务问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26397959/

相关文章:

javascript - 使用事务检查是否存在多个文档,如果不存在则添加它们

ruby-on-rails - 如何在运行 `rake db:migrate` 后立即防止任何 ActiveRecord::PreparedStatementCacheExpired 错误?

java - 将不透明度从 0.0 0.1 .. 更改为 1.0 以创建动画效果

java - 请为基于动态表单的 Web 应用程序推荐一个好的框架

java - 为什么有些带参数的构造函数仍然调用this()?好像什么也没做?

java - 多线程:为什么这个输出?它是确定性的吗?

database - 数据库厂商如何实现事务?

java - 如何将 System.nanoTime 的结果转换为 Java 中的日期?

java - ScheduledThreadPoolExecutor Callable() 阻塞了我的主 Activity UI 线程

c++ - boost scoped_lock。这个会锁吗?