SQL 面试题 目录

SQL 中什么是乐观锁 (Optimistic Locking) 和悲观锁 (Pessimistic Locking)?

推荐答案

乐观锁 (Optimistic Locking)

乐观锁假设在大多数情况下,数据不会发生冲突,因此允许多个事务同时读取和修改数据。在提交时,系统会检查数据是否被其他事务修改过。如果没有冲突,则提交成功;如果有冲突,则回滚并提示用户重新尝试。

悲观锁 (Pessimistic Locking)

悲观锁假设在大多数情况下,数据会发生冲突,因此在事务开始时就会锁定数据,防止其他事务读取或修改数据。只有在事务完成后,才会释放锁,允许其他事务访问数据。

本题详细解读

乐观锁的实现

乐观锁通常通过版本控制来实现。在数据库表中添加一个版本号字段(如 version),每次更新数据时,版本号加一。在提交事务时,系统会检查当前版本号是否与读取时的版本号一致。如果一致,则提交成功;如果不一致,则回滚并提示用户重新尝试。

悲观锁的实现

悲观锁通常通过数据库的锁机制来实现。在事务开始时,使用 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE 语句锁定数据,防止其他事务读取或修改数据。只有在事务完成后,才会释放锁。

适用场景

  • 乐观锁:适用于读多写少的场景,冲突较少的情况下,可以提高并发性能。
  • 悲观锁:适用于写多读少的场景,冲突较多的情况下,可以避免数据不一致的问题。

优缺点对比

  • 乐观锁

    • 优点:提高并发性能,减少锁的开销。
    • 缺点:在冲突较多的情况下,可能导致多次重试,影响性能。
  • 悲观锁

    • 优点:避免数据不一致的问题,适合高冲突场景。
    • 缺点:降低并发性能,增加锁的开销。
纠错
反馈