На OptimisticLockException: для версии установлено новейшее значение - PullRequest
0 голосов
/ 11 июня 2018

Я использую оптимистическую блокировку в Hibernate (через @Version для версии-атрибута моего компонента).Поэтому при конфликтующих изменениях выбрасывается OptimisticLockException.

Но - то, чего я не ожидал: когда выбрасывается это исключение, атрибут версии моего компонента автоматически устанавливается на фактическое значение (база данных), в то время какдругие атрибуты имеют старые значения.Поэтому, если я сделаю обновление для этого объекта во второй раз, OptimisticLockException больше не генерируется (так как версия больше не отличается), и данные в этом объекте перезаписывают состояние базы данных.

Ожидается ли этоповедение?

РЕДАКТИРОВАТЬ:

MyBean:

@Entity
@Table(schema = "my_schema", name = "my_bean")
public class MyBean {
    ...
    @Version
    @Column(name = "version")
    private int version;
    ...
}

Чтение:

CriteriaQuery<MyBean> criteriaQuery = (CriteriaQuery<MyBean>)criteriaBuilder.createQuery(MyBean.class);
Root<MyBean> root = criteriaQuery.from(MyBean.class);
Expression<Integer> expr = (Expression<Integer>)root.get(MyBean_.id);
criteriaQuery.where(criteriaBuilder.equal(expr, 1));
Query q = currentSession.createQuery(criteriaQuery);
MyBean myBean = (MyBean)q.getResultList().get(0);

System.out.println("Version after read:" + myBean.getVersion();

Запись:

System.out.println("Version before update:" + myBean.getVersion();

try {
    myBean.setText("test");
    transaction = session.beginTransaction();
    session.update(myBean);
    transaction.commit();
}
catch (Exception exc) {
    exc.printStackTrace();
    transaction.rollback;
    session.close();
}

System.out.println("Version after update:" + myBean.getVersion();

Ведение журнала:

Process 1: "Version after read: 1"
Process 2: "Version after read: 1"

Process 1: "Version before update: 1"
Process 1: "Version after update: 2"

Process 2: "Version before update: 1"
    javax.persistence.OptimisticLockException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.internal.ExceptionConverterImpl.wrapStaleStateException(ExceptionConverterImpl.java:214) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:88) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1443) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]

Process 2: "Version after update: 2"

1 Ответ

0 голосов
/ 11 июня 2018

Нет, это не ожидаемое поведение. Версия не должна увеличиваться в случае OptimisticLockException. Пожалуйста, проверьте, обновляется ли какая-либо связанная дочерняя сущность, но во время обновления родительской сущности OptimisticLockException или наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...