我有一个简单的问题。我有一个包含一些数据和序号的数据库表。并且有几个节点指向数据库。

我需要每个节点来保证这一点,并且只有这个节点在此时选择具有最小顺序号的一行。

在休眠状态下执行此操作的最佳方法是什么?

我要做的第一件事是使用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,并使用事务提交释放锁。

07-24 19:14