我有一个简单的问题。我有一个包含一些数据和序号的数据库表。并且有几个节点指向数据库。
我需要每个节点来保证这一点,并且只有这个节点在此时选择具有最小顺序号的一行。
在休眠状态下执行此操作的最佳方法是什么?
我要做的第一件事是使用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);
}
}
但是这种方式很容易出错-我应该重试多少次,并间隔多少时间?
我宁愿找到有保证的顺序锁定的更好方法。但是不知道该怎么做。
最佳答案
考虑使用LockMode.PESSIMISTIC_FORCE_INCREMENT,并使用事务提交释放锁。