Мы работаем над параллельной системой, которая обрабатывает транзакции. Транзакция будет получена от конечной точки и должна быть отправлена другой. Наша политика заключается в том, что когда мы обрабатываем транзакцию из конечной точки, следующая транзакция должна ждать до завершения последней.
Итак, мы используем 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 ) Кэш второго уровня гибернации отключен.