Я ищу эффективный способ реализации операции сравнения и замены в Berkeley DB. Сейчас я использую очень старую версию, однако, на первый взгляд, даже самая последняя (распространяемая с сайта Oracle) не имеет единого метода для такой операции.
Я искал какой-то метод, например
replace(Transaction, Key, ExpectedValue, NewValue)
со следующей семантикой: БД получает значение, связанное с данным ключом, если это значение существует и равно ExpectedValue, то это значение будет изменено на NewValue, в противном случае метод возвращает неуспешный OperationStatus.
Похоже, такого метода нет, поэтому мне интересно, как это сделать наиболее эффективным способом.
Прямо сейчас я использую следующий подход: я делаю
db.get(null, key) -> {currentValue, version}
db.put(null, key, {currentValue, newRandomIdVersion})
db.get(null, key)
Я сравниваю значение и версию, если они совпадают, я делаю окончательное обновление, удаляя старую версию. Если какой-либо шаг терпит неудачу, весь процесс перезапускается.
Я чувствую, что это очень неоптимально - я ошибаюсь?