Проверка активных транзакций в среде Xodus?

#java #database #xodus

#java #База данных #xodus

Вопрос:

Каков способ проверить, есть ли активные транзакции в среде Xodus?

Итак, если у вас есть это:

Environment environment = environmentCache.get(databasePath);

Как узнать, есть ли активные транзакции в этой среде?

Комментарии:

1. Как вы собираетесь использовать такую информацию?

2. @VyacheslavLukianov чтобы завершить процесс Java, который блокирует среду, поэтому перед его завершением программа сначала проверит, есть ли текущие активные транзакции, а затем, если транзакций больше нет (после ожидания), он может безопасно завершить процесс по идентификатору

3. почему бы просто не закрыть среду?

4. @VyacheslavLukianov невозможно, программа, которая завершит процесс, удерживающий блокировку, отличается от среды, что означает два разных процесса. Итак, этот процесс «Xodus», который содержит среду, предоставит удаленный метод, который, в свою очередь, возвращает true / false для метода isTransactionActive() метода, если это возвращает false, другой процесс может затем безопасно завершить процесс «Xodus». И под удаленным я подразумеваю RMI.

5. Как бы вы разрешили условие гонки — новая транзакция может начаться после того, как ваш открытый метод вернул тот факт, что активных транзакций нет? Почему бы просто не предоставить метод, который закрывает среду?

Ответ №1:

Чтобы безопасно закрыть среду под нагрузкой, используйте следующий код:

 // on init stage:
env.getEnvironmentConfig().setEnvCloseForcedly(true);

// method that closes environment:
env.executeTransactionSafeTask(() -> {
    env.executeInExclusiveTransaction(t -> {
        env.close();
    });
});
  

Код извлекается в качестве теста. Этот способ закрытия среды не является немедленным, он ожидает завершения текущих запущенных транзакций, а затем закрывает среду в эксклюзивной транзакции, чтобы убедиться, что никакая другая транзакция записи не может быть запущена параллельно. Все еще могут быть параллельные транзакции только для чтения, но их, очевидно, можно игнорировать.

Предоставьте код как удаленный метод для удаленного управления средой. После вызова метода удаленный конец может немедленно попытаться открыть среду над тем же местоположением с достаточно длительным временем ожидания блокировки ( EnvironmentConfig.setLogLockTimeout(..) ), скажем, 1 минута.