Служба приложений получает блокировку с помощью JDBC LockRepository, которая должна выполняться внутри @Transaction?
У нас есть пример службы приложений, которая обновляет JDBCRepository, и поскольку это приложение может работать на нескольких JVMS (без заголовка). Нам нужна глобальная блокировка для сериализации этих обновлений.
Я посмотрел твой тест и надеялся, что мой вариант использования тоже подойдет. ... JdbcLockRegistryDifferentClientTests
В моей конфигурации есть DefaultLockRepository и JdbcLockRegistry;
Я запустил (java -jar boot.jar) мое приложение на двух терминалах для симуляции. Когда я получаю блокировку и запускаю tryLock () без @Transaction для службы приложений, они оба получают блокировку (хотя и почти одну) за другой почти сразу. Я ожидал, что один из них НЕ получит его как минимум 10 секунд (истечение срока действия по умолчанию).
Service (Instance -1) {
Obtain("KEY-1")
tryLock()
DoWork()
unlock();
close();
}
Service (Instance -2) {
Obtain("KEY-1")
tryLock() <-- Wait until the lock expires or the unlock happens
DoWork()
unlock();
close();
}
Я также заметил здесь DefaultLockRepository , что область транзакции (если не унаследована) относится только к операции JDBC.
Когда я меняю услугу на
@Transaction
Service (Instance -1) {
Obtain("KEY-1")
tryLock()
DoWork()
unlock();
close();
}
Работает как положено.
Я совершенно уверен, что что-то пропустил? Но я ожидаю, что моя операция блокировки будет учитывать глобальные блокировки (факт наличия блокировки в хранилище JDBC с истечением срока действия) до момента разблокировки или истечения срока действия.
Мое понимание неверно?