2014-10-16 3 views
0

Я столкнулся с одним сценарием в веб-приложении, которое работает в кластерной среде.Проблема одновременной транзакции в кластерной среде

У нас есть 2 узлов (как есть JVM)

  1. Node1
  2. 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.

Мне интересно, что делать дальше? Любая помощь очень полезна.

+2

Какая БД вы используете? любая основная последовательность поддержки БД (либо при вставке, либо при запуске и т. д.) - вы не должны реализовывать ее самостоятельно! – alfasin

+0

Мы используем Oracle 11g. Я знаю, что это плохой подход для реализации последовательности самостоятельно, но это уже существующий код, который мне нужно исправить. – DeepInJava

+1

Используйте последовательность базы данных или, по крайней мере, используйте пессимистическую блокировку при чтении последовательности (выберите для обновления). –

ответ

1

Если вы не можете контролировать это в базе данных, как и многие из комментариев, ваш следующий вариант - реализовать некоторую форму простого управления версиями.

Одним из подходов является просто изменить свое заявление об обновлении:

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

, а затем посмотреть, сколько записи были обновлены (executeUpdate PreparedStatement (в) даст вам это значение, например). Если результат равен 0, то другой экземпляр вашего процесса разбил вас на него, поэтому вы каким-то образом справляетесь с ним (бросаете и делаете ошибку, выбираете другой порядковый номер, ...)

 Смежные вопросы

  • Нет связанных вопросов^_^