Hibernate не загружал зафиксированные изменения - PullRequest
0 голосов
/ 20 января 2019

Мы работаем над параллельной системой, которая обрабатывает транзакции. Транзакция будет получена от конечной точки и должна быть отправлена ​​другой. Наша политика заключается в том, что когда мы обрабатываем транзакцию из конечной точки, следующая транзакция должна ждать до завершения последней.

Итак, мы используем for update nowait на конечной точке в нашей базе данных Oracle, и следующая транзакция с той же конечной точкой будет ждать. Но у нас есть некоторые проблемы. Предположим, что у нас есть спящий объект с именем EndPoint.

@Entity
class EndPoint {
   private int id;
   private int cntr;
   // With desired setter/getter
}

и транзакция такая ниже:

@Entity
class Transaction {
    private int id;
    private int fromId;
    // With desired setter/getter
}

так, cntr конечной точки должен быть увеличен на 1, когда транзакция завершена. Критическая часть нашего кода выглядит следующим образом:

Transaction trx = ...;
HibernateUtil.getCurrentSession().createSQLQuery("select cntr from EndPoint where id = ... for update nowait").list(); // lock until commit
EndPoint from = HibernateUtil.getCurrentSession().load(EndPoint.class, trx.getFromId()); // query database for entity.
from.setCntr(from.getCntr() + 1);
HibernateUtil.getCurrentSession().saveOrUpdate(from);
HibernateUtil.getCurrentSession().getTransaction().commit();  // release lock

Но, иногда, когда мы получили более одной транзакции от терминала, некоторые терминалы получают тот же cntr, что недопустимо в зависимости от системы блокировки / разблокировки базы данных.

Так, может кто-нибудь сказать мне, что случилось?

Заранее спасибо.

Примечание 1 ) Кэш второго уровня гибернации отключен.

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