У меня возникают трудности при попытке понять, как оптимизированная блокировка на основе версий предотвращает «последнюю попытку-победы» и соответствующую переопределение.Оптимистическая блокировка и переопределение
Чтобы сделать вопрос более конкретным, давайте рассмотрим следующий псевдо-код, который использует JDBC:
connection.setAutoCommit(false);
Account account = select(id);
if (account.getBalance() >= amount) {
account.setBalance(account.getBalance() - amount);
}
int rowsUpdated = update(account); // version=:oldVer+1 WHERE version=:oldVer
if (rowsUpdated == 0) throw new OptimisticLockException();
connection.commit();
Вот что, если другая транзакция будет совершать свои изменения прямо между обновлением и фиксации? Если транзакции являются параллельными, то обновление, сделанное первой транзакцией, еще не выполнено и поэтому не видно второй транзакции (с надлежащими уровнями изоляции), и поэтому первая транзакционная фиксация переопределит изменения второй транзакции без какого-либо уведомления или ошибка.
В этом случае оптимистическая блокировка просто уменьшает вероятность проблемы, не предотвращая ее вообще?
Таким образом, проигрывающая транзакция просто блокируется методом «обновления» и ждет, пока выигрыш не зафиксирует, правильно? – AngryJuice
@AngryJuice - это может зависеть от того, как ваш db обрабатывает уровень изоляции, но да, это наиболее вероятный сценарий. – jtahlborn
Спасибо, это то, что я изначально предложил – AngryJuice