我在集群环境中运行的 Web 应用程序中遇到了一个场景。
我们有2个节点(都有JVM)
- 节点1
- 节点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/