У меня есть сервер веб-приложений Spring Boot с балансировкой нагрузки на AWS Elastic beanstalk. Серверы обращаются к одной и той же базе данных MySQL. Мы создаем внешние объекты в AWS программно. Эти объекты должны контролироваться на предмет их статуса.
Это заставляет поток запускаться и проверять состояние соответствующих объектов. Проблема, с которой я сталкиваюсь, заключается в том, что во время работы этих потоков (по одному на каждый экземпляр) само приложение не может обновлять записи из других источников.
Я получаю сообщение об ошибке «Время ожидания блокировки истекло. Попробуйте перезапустить транзакцию». Я понимаю, что запись заблокирована на фронте БД, но не понимаю, почему. Ниже приведена логика, реализованная в этом потоке.
@Override
public void run() {
session = this.sessionFactory.openSession();
try {
while (true) {
Thread.sleep(5000);
validateWorkspaceState();
if (tries == 30)
break;
}
} catch (Exception e) {
//Some log
} finally {
singleNodeCloudStackManagementService.clearThread(workspaceId);
this.session.close();
}
}
Выполните проверку состояния:
private void validateWorkspaceState() {
Transaction tx = null;
try {
tx = session.beginTransaction();
log.info("Validating status for workspace " + workspaceId);
rmlWorkspace = (RmlWorkspace) session.get(RmlWorkspace.class, workspaceId);
if (workspaceRequiresStatusCheck()) {
//Perform actions for status check
} else {
log.info("Exiting status check as the workspace does not require status check");
tries++;
}
txCommitAndOpenSession(tx);
} catch (RollbackException e) {
log.error(e.getMessage());
}
}
Выполните фиксацию txn и снова откройте сеанс:
public void txCommitAndOpenSession(Transaction tx) {
tx.commit();
session.close();
session = this.sessionFactory.openSession();
}
Основной вопрос- Почему именно это вызывает блокировку?