Возникла проблема при использовании функции MySQL RELEASE_LOCK - PullRequest
2 голосов
/ 05 апреля 2020

В нашем микросервисе мы выставили 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 (как хранилище данных)

...