Hibernate Mysql Lock Тайм-аут ожидания - попробуйте перезапустить транзакцию - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть сервер веб-приложений 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();
}

Основной вопрос- Почему именно это вызывает блокировку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...