Я столкнулся с одним сценарием в веб-приложении, которое работает в кластерной среде.Проблема одновременной транзакции в кластерной среде
У нас есть 2 узлов (как есть JVM)
- Node1
- Node2
Я бег сделка одна базы данных в моем приложении, где читается 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 минуту) из-за outofmemoryerror на node1. между тем другой запрос отправляется в Node2 и принимает последовательность no. из базы данных и обновить его. Таким образом, и запрос получил ту же последовательность, что и мы, мы не хотим, так как нам нужна уникальная последовательность no. для всех запросов.
Мы не можем синхронизировать транзакции, так как это не поможет, потому что оно работает на разных JVM.
Мне интересно, что делать дальше? Любая помощь очень полезна.
Какая БД вы используете? любая основная последовательность поддержки БД (либо при вставке, либо при запуске и т. д.) - вы не должны реализовывать ее самостоятельно! – alfasin
Мы используем Oracle 11g. Я знаю, что это плохой подход для реализации последовательности самостоятельно, но это уже существующий код, который мне нужно исправить. – DeepInJava
Используйте последовательность базы данных или, по крайней мере, используйте пессимистическую блокировку при чтении последовательности (выберите для обновления). –