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锁机制的知识对你有所帮助。记得关注我们的节目,获取更多面试技巧和知识。我们,下期再见!