2015-05-28 5 views
0

Я использую Spring Data JPA с Hibernate как провайдер постоянства по PostgreSQL. Я пытаюсь обеспечить пессимистичные блокировки:Пессимистическая блокировка не выполняется с ObjectOptimisticLockingFailureException

public interface MediaRepository extends JpaRepository<Media, Long>, MediaRepositoryCustom { 
Long countByCreatedBy(User creator); 

@Query("select m from Media m where m.id = ?1") 
@Lock(LockModeType.PESSIMISTIC_WRITE) 
Media findOneAndLock(Long id); 
} 

Я пытаюсь вызвать findOneAndLock от 2-х потоков. Я ожидаю, что если Thread A заблокирует объект, Thread B должен ждать, пока блокировка не будет отпущена. Но вместо этого Thread B throws org.springframework.orm.ObjectOptimisticLockingFailureException.

Я уверен, что оба потока выполняют выбор для обновления (2 таких записи в журнале базы данных).

ответ

1

Поведение по умолчанию - не ждать. Необходимо указать период ожидания в persistence.xml

<properties> 
    <property name="javax.persistence.lock.timeout" value="1000"/> 
</properties> 
+0

он уже установлен. – skozlov

+0

Какая ценность? И второй поток будет ждать только сконфигурированное время и НЕ бесконечно. – Rohit

+0

10000. Опять же, я поймаю org.springframework.orm.ObjectOptimisticLockingFailureException. – skozlov

Смежные вопросы