在尝试了解基于版本的乐观锁定如何防止“最后提交获胜”问题和适当的覆盖时,我遇到了困难。
为了使问题更具体,让我们考虑以下使用 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();
在这里,如果其他事务会在更新和提交之间提交其更改怎么办?如果事务是并发的,则第一个事务所做的更新尚未提交,因此对第二个事务不可见(具有适当的隔离级别),因此第一个事务提交将覆盖第二个事务的更改,而无需任何通知或错误。
乐观锁定是否只是降低了问题的可能性,而不是一般地阻止它?