悲观锁和乐观锁
我们通常希望避免在两个并行事务中产生如下情形: Adam的事务读取数据 X Barbara的事务读取数据 X Adam的事务修改数据 X,并将其修改为 XA Adam的事务写入数据 XA Barbara的事务修改数据 X,并将其修改为 XB Barbara的事务写入数据 XB 结果是,Adam所做的修改完全被Barbara所覆盖掉了,但是Barbara对此却毫不知晓。像这样的情况通常被称为“脏读”。显然,我们希望的结果是Adam写入 XA,而Barbara需要在写入 XB之前检查对 XA 的修改。 乐观锁的工作原理 (Optimistic Locking ) 乐观锁基于的假设是实际中冲突很少发生,即使发生,抛出一个错误也比想办法避免它们更容易接受和简单。在乐观锁中,允许一个事务正确完成,但另一个事务需要抛出异常并回滚,并且必须被重新执行或者丢弃。 我们还以Adam和Barbara为例,下面是一个使用乐观锁可能发生的情形: Adam的事务读取数据 X Barbara的事务读取数据 X Adam的事务修改数据 X,并将其修改为 XA Adam的事务写入数据 XA Barbara的事务修改数据 X,并将其修改为 XB Barbara的事务试图写入数据 XB,但是收到一个错误 Barbara需要读取数据 XA(或者重新开始一个新的事务) Barbara的事务修改数据 XA,并将其修改为