2014-09-29 1 views
1

У меня есть постоянный спящий режим, управляемый @entity Obj в Hibernate, который имеет, например, поля id, fieldA и fieldB.Есть ли способ избежать HibernateOptimisticLockingFailureException?

В некотором классе у меня есть два метода @Transactional, updateA() и updateB().
updateA() получает Obj по его идентификатору, выполняет некоторую обработку и обновляет свое поле A.
обновлениеB такой же для fieldB.

У меня также есть два клиента, которые постоянно делают запросы. Один клиент всегда делает запросы, вызывающие updateA(), а другой клиент всегда вызывает updateB().
Они оба передают один и тот же идентификатор существующего объекта Obj.

Есть ли способ избежать HibernateOptimisticLockingFailureException, который продолжает встречаться или обрабатывать его один раз успешно, учитывая тот факт, что каждый метод обновляет разные поля? Какой-то слияние?

Для завершения изображения поток, который вызывает updateA(), фактически вызывает другие транзакционные методы, похожие на updateA(), но ни один из них не обновляет поле B.

Сначала я просто попытался поймать исключение и повторить попытку во второй раз. Но иногда это терпит неудачу во второй раз тоже ... Это не похоже на хорошее решение.

+0

Вы используете управление версиями ('@ Version') на вашем организация? –

+0

Не использовать @Version. Будет ли читать об этом – inor

ответ

1

Если вы можете спокойно сделать это, самый простой способ, чтобы исключить fieldB из оптимистической блокировки:

import org.hibernate.annotations.OptimisticLock; 

/* ... */ 

@OptimisticLock(excluded=true) 
private B fieldB; 
+0

не будет, если это произойдет, если два клиента одновременно обновляют поле B? –

+0

@ThomasStets Не удается каким образом? –

+0

ОК, я пропустил тот факт, что у него только одно обновление клиентом поля. Однако, если больше клиентов, можно перезаписать обновление с другого без уведомления Hibernate. –

1

Вы можете использовать automatic optimistic locking retry mechanism.

Для этого необходимо добавить следующую зависимость:

<dependency> 
    <groupId>com.vladmihalcea</groupId> 
    <artifactId>db-util</artifactId> 
    <version>0.0.1</version> 
</dependency> 

Затем просто маркировать свои методы обслуживания со следующей аннотацией:

@Retry(times = 5, on = OptimisticLockException.class) 

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

  • Нет связанных вопросов^_^