/ MySQL 有哪几种数据存储引擎?有什么区别? /
MySQL 支持多种数据存储引擎,其中最常见的是 MyISAM 和 InnoDB 引擎。可以通过使用”show engines”命令查看 MySQL 支持的存储引擎。
存储方式:MyISAM 引擎将数据和索引分别存储在两个不同的文件中,一个是.MYD 文件用于存储数据,一个是.MYI 文件用于存储索引。而 InnoDB 引擎将数据和索引存储在同一个文件中。
锁机制:MyISAM 引擎只支持表级锁,即在对某个表进行读写时,会锁住整个表,其他操作需要等待。而 InnoDB 引擎支持行级锁,可以在并发访问时只锁住需要操作的行,提高了并发性能。
事务支持:MyISAM 引擎不支持事务,而 InnoDB 引擎支持事务。事务是一种保证数据一致性和完整性的机制,可以将多个操作作为一个整体进行提交或回滚。
外键支持:MyISAM 引擎不支持外键约束,而 InnoDB 引擎支持外键约束。外键是用于维护表与表之间关系的一种机制,可以确保数据的一致性
/ 什么是脏读、幻读、不可重复读?要怎么处理? /
脏读、不可重复读和幻读是数据库中的一些并发问题。
脏读是指一个事务在读取另一个未提交事务的数据时,如果未提交事务回滚了,则读取到的数据是不一致的。
不可重复读是指一个事务在相同的查询条件下,多次读取数据结果不一致。例如,事务 A 第一次读取数据时,事务 B 修改了相同的数据并提交,导致事务 A 第二次读取时数据不一致。
幻读是指一个事务在多次查询中,由于其他事务插入或删除数据,导致查询结果出现新增或减少的情况。
处理这些问题的方法有几种:
加锁:可以使用数据库提供的锁机制,如行级锁或表级锁,来控制并发访问,确保数据的一致性。但是加锁会降低并发性能。需要自己根据业务需要添加共享锁还是排它锁。
调整事务隔离级别:数据库提供了不同的事务隔离级别,如读未提交、读已提交、可重复读和串行化。可以根据具体情况选择合适的隔离级别来避免并发问题。
/ 事务的基本特性和隔离级别有哪些? /
事务的基本特性包括 ACID:
原子性(Atomicity):一个事务中的所有操作要么全部成功提交,要么全部失败回滚。事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏。事务的操作会将数据库从一个一致性状态转换为另一个一致性状态。
隔离性(Isolation):并发执行的事务之间应该相互隔离,一个事务的执行不应该被其他事务干扰。隔离性确保每个事务在并发环境中都能独立执行,不会受其他事务的影响。
持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中。即使发生系统崩溃或电源故障,数据库也能够恢复到事务提交后的状态。
隔离级别是控制事务隔离性的一个参数,常见的隔离级别包括:
读未提交(Read Uncommitted):最低级别的隔离级别,允许一个事务读取另一个事务未提交的数据。会出现脏读问题。
读已提交(Read Committed):保证一个事务只能读取到其他事务已经提交的数据,解决了脏读问题。但是可能会出现不可重复读问题。
可重复读(Repeatable Read):保证在一个事务中多次读取同一数据时,得到的结果是一致的。解决了不可重复读问题。但是可能会出现幻读问题。
串行化(Serializable):最高级别的隔离级别,要求事务串行执行,避免了幻读问题。但是会降低并发性能。
/ MySQL 的锁有哪些?什么是间隙锁? /
MySQL 的锁可以根据锁的粒度进行划分,包括行锁、表锁和全局锁。下面是对每种锁的详细说明:
行锁:InnoDB 引擎支持行锁,它的粒度很小,可以提供较好的并发性能,但是会消耗更多的资源。行锁又可以细分为以下两种:
共享锁:使用SELECT ** LOCK IN SHARE MODE语句来获取共享锁,读取操作期间可以共享,但会阻塞写操作。
排它锁:使用SELECT ** FOR UPDATE语句来获取排它锁,各种操作都会被阻塞,而且在执行 INSERT、DELETE、UPDATE 语句时会自动添加排它锁。
自增锁:当涉及到自增字段时,每次获取自增值时都会进行阻塞。需要注意的是,自增锁与业务逻辑无关。
表锁:直接锁住整张表而不是单独的行,表锁消耗的资源比较少,但是锁的粒度较大,导致并发性能较低。表锁可以细分为以下两种:
表共享锁:多个会话可以同时获取表的共享锁,读操作可以并发进行,但是写(INSERT、DELETE、UPDATE)会被阻塞。
表排它锁:获取表排它锁的会话会阻塞其他会话的所有操作,包括读和写。
全局锁:使用 FLUSH TABLES WITH READ LOCK 语句来获取全局锁,通常用于表数据备份等场景。
间隙锁(Gap Lock)主要针对带有索引的字段。例如,对于一个拥有 user_id 索引的 user 表(user_id, name),数据有(1,a)(4,b)(9,c),当执行 UPDATE user SET name = d WHERE user_id = 5 时,会锁定 5-9 之间的记录(不包括自身)。而执行 UPDATE user SET name = 5 WHERE user_id = 4 时,则是记录锁,只锁住一条记录。
另一种类型是 Next-Key 锁,它实际上是右侧界的记录锁。对于上述 user 表的索引,Next-Key 锁会在(1, a)、(4, b)、(9, c)之间进行锁定。表示从左开区间到右开区间封闭,即( -∞, 1], (1, 4], (4, 9], (9, +∞)。这样可以确保范围内的记录都受到锁的保护。
通过使用间隙锁和 Next-Key 锁,可以更精确地控制并发操作,提高数据库的数据一致性和并发性能。
/ 总结 /
本次种子题目主要涵盖了 MySQL 事务的 ACID 特性和隔离级别。这些内容涵盖了 MySQL 数据库的核心知识和重要技术,不仅在面试中起到关键作用还对于优化数据库性能和应用开发都具有重要意义。
原文始发于微信公众号(灵墨AI探索室):MySQL面试题全解析:准备面试所需的关键知识点和实战经验(上)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/208660.html