В нашем микросервисе мы выставили 2 API, которые в конце концов пытаются прочитать, вставить и обновить один и тот же ресурс. Поэтому, чтобы избежать несогласованности данных, мы пытаемся сериализовать запрос, взяв ключ блокировки (ключ получен из данных запроса и всегда будет одинаковым в обоих API).
Фрагмент кода
Session session = sessionFactory.openSession();
String lockKey = "key-name";
try {
// acquire lock query= SELECT GET_LOCK(lockKey, 5000)
hibernateMysqlLock.acquireLockOrException(lockKey, session);
someService.execute(someObject);
} finally {
// releasing lock query= SELECT RELEASE_LOCK(lockKey)
hibernateMysqlLock.release(lockKey, session);
session.close();
}
Большую часть времени SELECT RELEASE_LOCK(lockKey)
не освобождает блокировку, и возврат 0 и 0 означает блокировка не была установлена этим потоком (в этом случае блокировка не снята) , (согласно do c https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release -lock )
Нужна помощь в устранении проблемы, а также, если возможно, предложите лучший подход
Технический стек: dropwizard (с в спящем режиме) и MySQL (как хранилище данных)