Hibernate未加载已提交的更改

时间:2019-01-20 16:02:40

标签: hibernate

我们正在处理事务的并发系统。事务将从端点接收,应发送给另一端点。我们的政策是,当我们正在处理来自端点的事务时,下一个事务应该等待直到最后一个事务完成为止。

因此,我们在oracle数据库的端点上使用for update nowait,并且下一个具有相同端点的事务将等待。但是我们有一些问题。假设我们有一个名为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 ),休眠的二级缓存已禁用。

0 个答案:

没有答案