В недавней задаче после создания объекта я сбросил результат в базу данных. Таблица базы данных имела уникальное ограничение, означающее, что если бы я попытался во второй раз отправить одну и ту же запись sh, я бы получил ConstraintViolationException
. Пример фрагмента приведен ниже:
createEntityAndFlush(result);
sendAsyncRequestToThirdSystem(param);
Код для createEntityAndFlu sh:
private T createEntityAndFlush(final T entity) throws ServiceException {
log.debug("Persisting {}", entity.getClass().getSimpleName());
getEntityManager().persist(entity);
getEntityManager().flush();
return entity;
}
Причина, по которой я использовал flu sh, заключалась в том, что я хотел убедиться, что ConstraintViolationException
будет выброшено до завершения транзакции и, следовательно, вызова sendAsyncRequestToThirdSystem
. Но это был не тот случай, так как sendAsyncRequestToThirdSystem
был вызван после исключения.
Чтобы проверить код в условиях гонки, я использовал ManagedExecutorService и создал две выполняемые задачи (Future<?> submit(Runnable task))
для репликации входящего запроса.
В конце концов проблема была решена попыткой выполнить блокировку новой таблицы для каждого уникального идентификатора запроса, но я хотел бы знать, в чем я ошибался при первом подходе (например, неправильное использование fla sh , ManagedExecutorService был ответственным за неловкое поведение). Заранее спасибо!