我们正在处理事务的并发系统。事务将从端点接收,应发送给另一端点。我们的政策是,当我们正在处理来自端点的事务时,下一个事务应该等待直到最后一个事务完成为止。
因此,我们在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 ),休眠的二级缓存已禁用。