Многосерверное приложение, считывающее данные из одной таблицы
У меня есть приложение, работающее на двух разных экземплярах сервера. Приложение имеет одноэлементный EJB, для которого установлен таймер на запуск через каждую минуту. Метод в EJB читает записи из таблицы, удаляет их и публикует в очереди (все части одной транзакции). После запуска обоих серверов он пытается прочитать запись из таблицы одновременно.
Мой вопрос заключается в том, как разрешить только одному приложению читать записи, пока транзакция не будет завершена.
2 ответа
Вы можете использовать выбор для обновления:
select * from table for update
Это заблокирует выбранные записи на время транзакции, т.е. те же запросы, выданные другим сервером, будут ждать, пока транзакция не будет зафиксирована.
SELECT ... FOR UPDATE считывает последние доступные данные, устанавливая эксклюзивные блокировки для каждой строки, которую читает. Таким образом, он устанавливает те же блокировки, что и поиск SQL UPDATE для строк.
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
Спасибо за ответ!
Вот что я в итоге делаю. Я использую сервер приложений jboss и реализовал функцию HASingleton, которая позволяет одновременно запускать только один экземпляр одиночного компонента на одном сервере в кластерной среде.
https://docs.jboss.org/author/display/WFLY10/HA+Singleton+Features