整理好了!2024年最常见 20 道 MySQL面试题(六)

上一篇地址:整理好了!2024年最常见 20 道 MySQL面试题(五)-CSDN博客

十一、MySQL 中有哪些类型的锁?

MySQL 中有多种类型的锁,用于控制对数据库资源的并发访问,确保数据的一致性和完整性。以下是 MySQL 中常见的锁类型:

全局锁(Global Locks)

全局锁对整个数据库实例的访问进行限制。例如:

  • FLUSH TABLES WITH READ LOCK (FTWRL):这个命令会锁定所有表,使得其他线程不能进行写操作,直到锁被释放。

表级锁(Table-Level Locks)

表级锁用于控制对特定表的并发访问。MySQL 中的存储引擎,如 InnoDB 和 MyISAM,提供了不同类型的表级锁:

  • InnoDB:支持行级锁和表级锁,允许高并发性。
  • MyISAM:只支持表级锁,这可能导致并发访问时的性能瓶颈。

行级锁(Row-Level Locks)

行级锁是粒度最细的锁,只锁定数据表中某些行记录。InnoDB 存储引擎支持行级锁:

  • 共享锁(Shared Locks):允许持锁事务读取一行数据,但不能修改它。
  • 排他锁(Exclusive Locks):允许持锁事务读取和修改一行数据,其他事务不能读取或修改这行数据。

间隙锁(Gap Locks)

间隙锁是一种行级锁,用于锁定某个范围但不包括记录本身的区间。InnoDB 存储引擎使用间隙锁来防止幻读:

  • 间隙锁:锁定一个范围内的间隙,但不锁定记录本身。

意向锁(Intention Locks)

意向锁是一种表明事务想要在更高级别上加锁的锁。它们用于在多粒度锁定协议中表明锁的意图:

  • 意向共享锁(Intention Shared Lock):表明事务想要在某个更细的粒度上设置共享锁。
  • 意向排他锁(Intention Exclusive Lock):表明事务想要在某个更细的粒度上设置排他锁。

临键锁(Next-Key Locks)

InnoDB 存储引擎中的临键锁是一种结合了行锁和间隙锁的锁,用于处理行和行之间的间隙:

  • 临键锁:锁定一个具体的行以及在该行之前的间隙。

记录锁(Record Locks)

记录锁用于锁定索引记录:

  • 记录锁:锁定一个具体的索引记录。

自增锁(Auto-Increment Locks)

自增锁用于控制对自增字段的并发访问:

  • 自增锁:确保自增字段的值的唯一性。

元数据锁(Metadata Locks)

元数据锁用于控制对数据库结构的更改:

  • 元数据锁:锁定数据库结构,如表结构的更改。

死锁

虽然不是一种锁类型,但 MySQL 会检测死锁并采取措施解决,如回滚其中一个事务。

锁的兼容性

不同类型的锁之间存在兼容性问题,例如:

  • 共享锁之间是兼容的,可以共存。
  • 共享锁与排他锁不兼容,不能同时存在。

锁的粒度

锁的粒度决定了锁的范围,从大到小依次为:全局锁 > 表级锁 > 行级锁 > 间隙锁。

锁的模式

锁的模式决定了锁的类型和兼容性,如共享锁模式和排他锁模式。

了解这些锁的类型和它们的特性对于数据库管理员和开发者来说非常重要,因为它们直接影响到数据库的并发性能和数据一致性。在设计数据库应用时,合理使用锁可以提高性能,避免死锁和数据竞争条件。

十二、全局锁和表锁有什么区别?

全局锁和表锁是 MySQL 中用于控制并发访问的不同级别的锁。它们在作用范围、使用场景和性能影响方面有着明显的区别:

全局锁(Global Locks)

  • 作用范围:全局锁作用于整个数据库服务器实例,影响所有数据库和表。
  • 使用场景:全局锁通常用于备份操作,如 FLUSH TABLES WITH READ LOCK (FTWRL),它锁定所有表以进行一致性读取,适用于全库备份。
  • 性能影响:由于全局锁影响整个数据库实例,所以在锁定期间,除了某些特殊的复制线程外,其他所有的读写操作都会被阻塞,这可能导致整个数据库服务不可用。
  • 锁的类型:全局锁通常不是由事务自动控制的,而是由 DBA 或备份工具在需要时显式地请求。

表锁(Table Locks)

  • 作用范围:表锁作用于单个表,只影响该表的读写操作。
  • 使用场景:表锁在很多存储引擎中都有使用,尤其是在不支持行级锁的存储引擎如 MyISAM 中。它们用于在执行某些操作,如全表扫描或大批量更新时,保证数据的一致性。
  • 性能影响:表锁会阻塞其他事务对该表的所有读写操作,直到锁被释放。这可能导致并发性能下降,但在某些操作中是必要的,以保证数据的完整性。
  • 锁的类型:表锁可以是共享锁(允许多个读操作并发执行)或排他锁(只允许一个事务进行写操作,阻塞其他读写操作)。

主要区别

  1. 作用范围:全局锁影响整个数据库实例,而表锁只影响单个表。
  2. 使用频率:表锁在常规的数据库操作中使用得更频繁,全局锁则通常只在特定的维护任务(如备份)中使用。
  3. 性能影响:全局锁由于影响范围大,对性能的影响通常也更大。表锁虽然只影响单个表,但如果频繁使用或不当使用,也可能导致性能瓶颈。
  4. 存储引擎支持:不是所有的存储引擎都支持表锁。例如,InnoDB 存储引擎支持行级锁,而 MyISAM 存储引擎主要使用表级锁。
  5. 并发控制:全局锁通常用于控制整个数据库实例的并发访问,而表锁用于控制单个表的并发访问。

在数据库设计和运维中,理解全局锁和表锁的区别对于优化性能和保证数据一致性至关重要。通常建议尽可能使用行级锁或更细粒度的锁,以提高并发性能,但在某些特定的操作中,全局锁或表锁可能是必要的。

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值