MySQL面试题《锁》

104 阅读4分钟

My SQL中间有空格是为了让ai朗读的时候能念好。不然就是:M!Y!S!Q!L!

欢迎收听《面试速通》。在本期节目中,我们将探讨My SQL中的锁机制,这是确保数据一致性和并发控制的重要手段。

1. 数据库锁的作用以及有哪些锁?

数据库锁的作用

  • 保证数据的一致性和完整性。
  • 控制并发访问,防止多个事务同时操作同一数据时引发冲突。

常见的锁类型

  • 共享锁(S锁/读锁) :允许多个事务同时读取同一资源,但不允许任何事务修改该资源。

  • 排他锁(X锁/写锁) :独占锁,当前事务可以读写资源,其他事务不能读写该资源。

  • 意向锁(Intention Lock) :表级锁,用于指出事务打算对某些行加共享锁或排他锁。

    • 意向共享锁(IS锁) :事务打算对某些行加共享锁。
    • 意向排他锁(IX锁) :事务打算对某些行加排他锁。
  • 记录锁(Record Lock) :锁住单个行记录。

  • 间隙锁(Gap Lock) :锁住一个范围,但不包含记录本身,防止幻读。

  • 临键锁(Next-Key Lock) :记录锁和间隙锁的组合,锁住一个范围并包含记录本身,防止幻读。

2. 隔离级别和锁的关系是什么?

隔离级别决定了事务间的隔离程度,从而影响锁的使用:

  • 读未提交(Read Uncommitted) :不加锁,可能产生脏读。
  • 读已提交(Read Committed) :读取数据时会加共享锁,写入数据时会加排他锁,防止脏读,但可能产生不可重复读。
  • 可重复读(Repeatable Read) :读取数据时加行级共享锁(快照读时使用MVCC),写入数据时加排他锁,防止不可重复读,但可能产生幻读。
  • 可串行化(Serializable) :事务按顺序执行,读取数据时加共享锁,写入数据时加排他锁,完全防止幻读、不可重复读和脏读。

3. InnoDB 中的锁算法是什么?

InnoDB中的锁算法主要有:

  • Record Lock:锁住单个行记录。
  • Gap Lock:锁住一个范围,但不包含记录本身,防止其他事务在这个范围内插入数据,避免幻读。
  • Next-Key Lock:记录锁和间隙锁的组合,锁住一个范围并包含记录本身,防止其他事务在这个范围内插入数据,避免幻读。

这些锁算法主要用于实现不同的隔离级别,特别是可重复读和可串行化级别。

4. 什么是快照读和当前读?

  • 快照读(Snapshot Read) :使用MVCC(多版本并发控制)读取数据,读取的是数据的快照版本,不加锁,适用于SELECT语句。
  • 当前读(Current Read) :读取最新的数据版本,加锁,适用于需要锁定读取数据的操作,如SELECT ... FOR UPDATE、UPDATE、DELETE等。

5. 什么是MVCC以及实现?

MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种并发控制技术,通过保存数据的多个版本来实现事务的隔离性,减少锁冲突。

实现方式

  • 每个数据行有两个隐藏列:创建版本号(DB_TRX_ID)和删除版本号(DB_ROLL_PTR)。
  • 读取数据时,根据当前事务的版本号,判断数据行的创建版本号和删除版本号,决定是否可见。
  • 插入和更新操作生成新的数据版本,使用undo log记录旧版本。

MVCC在My SQL的InnoDB中实现了读已提交和可重复读隔离级别的无锁读操作。

6. My SQL中的锁机制与InnoDB锁算法有哪些?

My SQL中的锁机制

  • 表级锁:锁住整个表,适用于MyISAM等存储引擎,开销小,但并发性能低。
  • 行级锁:锁住单个行记录,适用于InnoDB存储引擎,开销大,但并发性能高。

InnoDB锁算法

  • Record Lock:锁住单个行记录。
  • Gap Lock:锁住一个范围,但不包含记录本身,防止幻读。
  • Next-Key Lock:记录锁和间隙锁的组合,锁住一个范围并包含记录本身,防止幻读。

InnoDB通过这些锁算法,实现了不同隔离级别下的并发控制,确保数据一致性和完整性。

感谢收听本期《面试速通》。希望这些关于My SQL锁机制的知识对你有所帮助。记得关注我们的节目,获取更多面试技巧和知识。我们,下期再见!