2014-12-03 38 views
0

我有一个简单的问题。我有一个数据库表和一些数据和序列号。还有几个节点指向数据库。休眠:连续获取行的最佳方式

我需要每个节点来保证这个节点只有这个节点在当时选择一个最小序列号的行。

在hibernate中做这件事的最好方法是什么?

我做的第一件事是用UPGRADE NOWAIT子句执行查询,然后尝试更新该行。否则,如果捕获LockAcquisitionException - 重试它一些超时。

while (retryCount < MAX_RETRY_ATTEMPTS) { 
    try { 
     Object obj = session().get(MyObject.class, stringId, LockMode.UPGRADE_NOWAIT); 
     //Acquire this row somehow 
    } catch (LockAcquisitionException | OptimisticLockException | StaleObjectStateException e) { 
     retryCount = handleException(retryCount, e); 
    } 
} 

但是这样很容易出错 - 我应该多少次重试,与间隔? 我宁愿找到保证顺序锁定的更好方法。但不知道如何做到这一点。

回答

1

考虑使用LockMode.PESSIMISTIC_FORCE_INCREMENT,并释放事务提交的锁定。

+0

问题 - 当我调用session.flush()时会释放锁,还是会在它退出@Transactional方法后被释放? – 2014-12-03 10:13:16

+1

锁定仅在提交后才会释放。 flush()主要用于批处理,不会释放锁。 – outdev 2014-12-03 10:16:59