Spring Пессимистический тайм-аут данных с помощью Postgres

Мне не удалось получить Spring Данные для отправки postgres a FOR UPDATE с помощью NOWAIT.

Я пробовал это в репозитории:

@Lock(value = LockModeType.PESSIMISTIC_WRITE)
MyObject findByUuid(String uuid);

Конфигурация (фрагмент)

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
 entityManagerFactoryRef = "docsEntityManagerFactory",
 transactionManagerRef = "docsTransactionManager",
@Bean(name = "docsEntityManagerFactory")
public EntityManagerFactory docsEntityManagerFactory(DataSource docsDataSource) {
props.setProperty("javax.persistence.lock.timeout", "0");
...

Я даже добавляю EntityManager в свою службу, и это возвращает 0:

logger.info(. Em.getProperties() получить ( "javax.persistence.lock.timeout" ));

но приведенное выше дает мне "FOR UPDATE", часть NOWAIT не устанавливается. Я устанавливаю правильную вещь (из другого сообщения, похоже, это должно работать).

Это приближает меня, хотя я бы предпочел не использовать raw sql

@Lock(value = LockModeType.PESSIMISTIC_WRITE)
 @Query(value = "SELECT * FROM the_table WHERE uuid = :uuid FOR UPDATE NOWAIT", nativeQuery = true)
 MyObject findByUuid(@Param("uuid") String uuid);

Это дает мне исключение блокировки, но затем Spring украшенный сервис (прокси) генерирует исключение Transaction/Rollback для возврата, что означает, что я не могу дать возвращаемое значение для метода, который мне нужен.

Вопросы: 1) Как мне получить Spring Data для добавления NOWAIT? 2) Есть ли способ вернуть значение? Я подозреваю, что мне нужно самому обрабатывать транзакцию или изменить логический поток? Не уверен, что Spring обрабатывает NOWAIT, если он будет вести себя по-другому.

Я понимаю, что есть похожие вопросы, но это немного другое. Я использую hibernate 4.2.15, spring -data-jpa 1.7.1, postgres sql 9.3.

1 ответ

использовать PESSIMISTIC_FORCE_INCREMENT

licensed under cc by-sa 3.0 with attribution.