Skip to content

面试速答(先看这里)

**一句话结论:**使用乐观锁在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。

60秒标准回答:

使用乐观锁在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本

这是我们前面的文章中提到的一句话,但是,如果你认为乐观锁的这个过程中完全没有任何锁的参与的话那就大错特错了

因为虽然在使用乐观锁的时候,我们没有显式的加锁,也没有用到对他的相关锁机制。但是乐观锁是使用update语句过程中实现的,update的过程是有锁的。数据库在更新时,会根据where条件对索引添加行级锁(可能还有gap 或者 next key)

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**这是我们前面的文章中提到的一句话,但是,如果你认为乐观锁的这个过程中完全没有任何锁的参与的话那就大错特错了。
  • **要点2:**因为虽然在使用乐观锁的时候,我们没有显式的加锁,也没有用到对他的相关锁机制。
  • **要点3:**所以,乐观锁的过程中,并不是完全无锁的。
  • **要点4:**那么,乐观锁既然也有锁,那么他相比悲观锁意义在哪里呢?
  • **要点5:**乐观锁最大的好处就是通过CAS的方式做并发校验,这个过程不需要提前加锁,只需要在更新的那一刻加一个短暂的锁而已,而悲观锁的话,需要你先select for update,锁的时长要长得多。

**记忆锚点:**update → 乐观锁 → 一刻加一个短暂的锁 → 那么他相比悲观锁 → 并不是完全无锁 → 的方式做并发

加分表达:

  • 这是我们前面的文章中提到的一句话,但是,如果你认为乐观锁的这个过程中完全没有任何锁的参与的话那就大错特错了。

追问准备:

  • 围绕「update」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「乐观锁」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「一刻加一个短暂的锁」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

📄 ✅乐观锁与悲观锁如何实现?

打开文档:✅乐观锁与悲观锁如何实现?

使用乐观锁在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

这是我们前面的文章中提到的一句话,但是,如果你认为乐观锁的这个过程中完全没有任何锁的参与的话那就大错特错了。

因为虽然在使用乐观锁的时候,我们没有显式的加锁,也没有用到对他的相关锁机制。但是乐观锁是使用update语句过程中实现的,update的过程是有锁的。数据库在更新时,会根据where条件对索引添加行级锁(可能还有gap 或者 next key)

所以,乐观锁的过程中,并不是完全无锁的。

那么,乐观锁既然也有锁,那么他相比悲观锁意义在哪里呢?

乐观锁最大的好处就是通过CAS的方式做并发校验,这个过程不需要提前加锁,只需要在更新的那一刻加一个短暂的锁而已,而悲观锁的话,需要你先select for update,锁的时长要长得多。