0

У меня возникают трудности при попытке понять, как оптимизированная блокировка на основе версий предотвращает «последнюю попытку-победы» и соответствующую переопределение.Оптимистическая блокировка и переопределение

Чтобы сделать вопрос более конкретным, давайте рассмотрим следующий псевдо-код, который использует 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(); 

Вот что, если другая транзакция будет совершать свои изменения прямо между обновлением и фиксации? Если транзакции являются параллельными, то обновление, сделанное первой транзакцией, еще не выполнено и поэтому не видно второй транзакции (с надлежащими уровнями изоляции), и поэтому первая транзакционная фиксация переопределит изменения второй транзакции без какого-либо уведомления или ошибка.

В этом случае оптимистическая блокировка просто уменьшает вероятность проблемы, не предотвращая ее вообще?

ответ

0

Идея «транзакции» базы данных заключается в том, что она должна обеспечивать гарантию «согласованности» по нескольким концептуальным операциям. база данных отвечает за ее соблюдение. поэтому, когда транзакция совершается, база данных должна разрешать транзакцию только в том случае, если она может гарантировать, что все, что произошло во время транзакции, остается в силе.

На практике база данных обычно обрабатывает это так, что как только одно из обновлений будет успешным, соответствующая строка будет заблокирована до тех пор, пока соответствующая транзакция не завершится. Таким образом, одно из обновлений гарантированно завершится неудачей.

Примечание: для вашего соединения jdbc требуется соответствующий уровень изоляции. уровень изоляции гарантирует, что тест для текущего значения, сделанного до обновления, по-прежнему применим во время записи.

+0

Таким образом, проигрывающая транзакция просто блокируется методом «обновления» и ждет, пока выигрыш не зафиксирует, правильно? – AngryJuice

+0

@AngryJuice - это может зависеть от того, как ваш db обрабатывает уровень изоляции, но да, это наиболее вероятный сценарий. – jtahlborn

+0

Спасибо, это то, что я изначально предложил – AngryJuice

 Смежные вопросы

  • Нет связанных вопросов^_^