docs: protected void unlockAbandonedLock(final String mutexName) {
          this.executeIgnoreRollback(
                  new TransactionCallbackWithoutResult() {
                      @Override
                      protected void doInTransactionWithoutResult(TransactionStatus status) {
                          final EntityManager entityManager = getEntityManager();
                          final ClusterMutex clusterMutex = getClusterMutex(mutexName);
  
                          if (!isLockAbandoned(clusterMutex)) {
                              // No longer abandoned
                              return;
                          }
  
                          logger.warn("Unlocking abandoned " + clusterMutex);
                          clusterMutex.unlock();
                          entityManager.persist(clusterMutex);
                          try {
                              entityManager.flush();
                          } catch (OptimisticLockException e) {
                              logger.trace(
                                      "Abandoned mutex {} was cleared by another thread or server",
                                      mutexName);
                          }
                      }
                  });
      }