MySQL 面试:什么是数据库事务,MySQL 为什么会使用 InnoDB 作为默认选项?

你曾被提过类似问题在面试中问过吗?或者将来会遇到,让我们一起探索和掌握它!

感谢您阅读这篇文章。更多面试问题:
https://programmerscareer.com/zh-cn/software-interview-set/

主题 1.1 — 深入探讨事务

简单地说,事务是在数据库管理系统(或类似系统)中对数据库进行的单元工作,并以可靠的方式独立处理。

事务通常表示数据库中的任何更改。更具体地说,事务是一系列数据库操作的逻辑单位。

考虑转移银行帐户中的资金的例子。这项操作需要两个步骤:

  1. 在一个帐户中取款。
  2. 在另一个帐户中存款。

两个步骤都必须完成,以便事务被认为已完成。如果在这两个操作之间发生了什么,例如服务器故障,事务将被认为是不完整的,并且数据库必须回滚到其前一致状态。

这样,事务帮助数据库保持完整性,确保相关操作的集合要么全部发生,要么全部不发生。事务的概念与 ACID(原子性、一致性、隔离性、持久性)密切相关,为数据的可靠处理提供了框架。

主题 1.2 — MySQL 和事务

MySQL 是一个数据库管理系统,提供了处理事务的支持。这意味着 MySQL 允许您将某些操作组合在一起,以便要么所有操作都执行,要么不执行。这在数据库中的中间步骤失败可能导致数据库不一致的场景中尤其重要。

再次考虑转移银行帐户中的资金的例子。现在,让我们说我们正在使用 MySQL 数据库来管理这些事务。让我们按步进:

  1. 用户 A 启动了一项事务,请求转移 $100 给用户 B。
  2. MySQL 开始了事务。
  3. MySQL 从用户 A 的帐户平衡中扣除 $100。
  4. MySQL 尝试为用户 B 的帐户添加 $100。
  5. 我们考虑两种情况:
  • 如果操作成功,MySQL 提交了事务,数据库显示了两个用户的更新帐户平衡。
  • 如果出现故障(可能是由于服务器崩溃或未预期的问题),MySQL 回滚了事务。结果是数据库保持了其初始状态,没有对用户 A 或用户 B 的帐户平衡进行更改。数据库保持一致性。

这样,MySQL 在保持 ACID 原则的情况下,为数据库处理提供了关键角色。

请记,MySQL 的事务处理功能不是每个设置都提供,而是需要特定类型的存储引擎。我们将在以后的主题中进一步探讨这一点。

主题 1.3 — 了解 InnoDB

现在,我们已经了解了事务在维护数据库完整性的重要性并了解了 MySQL 是如何处理事务的,是时候探讨 InnoDB 了。

InnoDB 是 MySQL 的存储引擎。初始版本的 MySQL 用户需要选择两种主要类型的存储引擎——MyISAM 和 InnoDB。每个引擎都有自己的优势和劣势。然而,MyISAM,一个更早的引擎,不支持事务。InnoDB,另一方面,提供了完整的事务支持,涉及多条语句的提交和回滚。InnoDB 还提供行级锁定,增加了多用户并发和性能,并具有我们已经讨论过的一些特性。

自 MySQL 5.5 版本的发布以来,InnoDB 已经成为默认的 MySQL 存储引擎,除非另外指定。这种决定主要基于 InnoDB 的稳定性和全功能性。

因此,InnoDB 的强事务支持,以及其他特性,使它成为广泛和复杂的数据库系统的强大选择。

主题 1.4 — InnoDB 的优势

InnoDB 的主要优势在于其强大的事务处理和行级锁定功能。这使它成为广泛和复杂的数据库系统的强大选择,特别是在具有高数量并发用户的情况下。

让我们来详细分析一些这些优势:

  1. 可靠性和持久性——ACID 遵从性: 就像我之前提到的一样,InnoDB 的事务遵从 ACID 模型,由其提交、回滚和崩溃恢复功能支持。它确保您的事务是可靠的,并且数据是持久的。
  2. 行级锁定: InnoDB 使用行级锁定,而 MyISAM 使用表级锁定。行级锁定更有效,因为它允许更高的并发性和在多用户环境中的更好的性能。
  3. InnoDB 缓冲池: InnoDB 使用缓冲池来缓存其表的数据和索引。这个特性减少了 I/O 操作,使系统更快和更具有性能。
  4. 外键约束: InnoDB 支持使用外键约束来维护参考完整性。当数据在一个表中依赖数据在另一个表中时,您可以通过外键约束来防止错误地删除关键数据。
  5. 自动崩溃恢复: InnoDB 具有自动崩溃恢复的功能。在崩溃期间更新的关键数据不会丢失,因为引擎自动重放其日志。

这些只是 InnoDB 为 MySQL 数据库带来的许多优势的一些。根据您的特定需求,可能还有更多与您的使用场景相关的好处。

主题1.5 — InnoDB 与 MyISAM

InnoDB 和 MyISAM 都是 MySQL 的存储引擎,但它们有显著的差异。了解这些差异对决定适合特定用例的存储引擎至关重要。

让我们根据以下几个关键参数进行比较:

  1. 事务: 我们以前已经讨论过,InnoDB 支持事务,而 MyISAM 不支持。如果您需要事务性整性,则应选择 InnoDB。
  2. 锁定: InnoDB 实现了行级锁定,而 MyISAM 实现了表级锁定。行级锁定允许更高的并发性并提供更好的性能,特别是对频繁、小数据修改的操作。
  3. 外键约束: InnoDB 支持外键约束,而 MyISAM 不支持。
  4. 全文搜索: MyISAM 具有内置的全文搜索支持,这使它成为主要要求的好选项。
  5. 数据安全性: InnoDB 使用事务日志来确保数据安全性(ACID 兼容性),而 MyISAM 不使用。
  6. 压缩: InnoDB 支持表压缩,允许表数据和相关索引进行压缩,以节省磁盘空间并提高 I/O 效率和性能。

最重要的是要记住,没有一个通用的“正确”选择之间的 InnoDB 和 MyISAM。适合的引擎取决于您的特定情况和要求。

主题1.6 — 案例研究:真实世界的例子和场景,数据完整性和事务的重要性

数据完整性和事务是许多真实世界的应用程序中的关键要素。为了说明其重要性在实际场景中,让我们考虑几个案例研究。

在线银行和金融服务:

  1. 在在线银行系统中,假设一个客户从储蓄账户转移了资金到支票账户。这个过程包括两个单独的任务:减少储蓄账户的余额和增加支票账户的余额。两个任务都需要发生。如果系统在储蓄账户被扣除后但是在支票账户被加载之前出现故障,客户就会损失资金。事务的 ACID 特性确保数据的一致性。

电子商务平台:

  1. 考虑一个客户在电子商务网站上下单。这个过程包括检查库存、确认付款、更新库存和确认订单。任何错误或故障在一个阶段应该阻止整个过程。事务为这些操作提供了安全的通路,确保数据的一致性。

航空航班预订系统:

  1. 当一个座位在航班上预订时,系统先检查座位的可用性,然后预订座位,然后接受付款。如果航空预订系统崩溃在座位被预订但是在付款确认之前,航空公司就会损失。通过事务,在后期的故障中,前期的阶段自动回滚,释放座位以供其他客户使用。

这些是几个场景,其中数据一致性是至关重要的。在关键系统中,InnoDB 的强大功能为数据的一致性提供了非常有用的支持。

主题1.7 — MySQL 面试题:数据库事务为什么重要,为什么 InnoDB 是 MySQL 的默认选项?

事务是数据库系统的一个重要概念。它们用于保护组织的信息,在系统故障(例如电力中断、软件崩溃或更危险的内容攻击)发生时进行保护。

事务是一系列的单个逻辑单元的操作序列。操作可以包括读取数据库记录、修改这些记录或者在特定参数内进行数据操作。

在数据库系统中,事务被管理使用 ACID 的缩写,它代表原子性、一致性、隔离性和持久性。

  • 原子性:保证事务中所做的所有更改都被提交到数据库中,或者如果发生错误,则不会提交任何更改。
  • 一致性:确保事务不会在运行后将数据库置于不一致的状态。
  • 隔离性:确保一个事务不会干另一个事务。
  • 持久性:确保已提交的更新持久化,即使发生电力中断或系统崩溃。

现在,为什么 InnoDB 是 MySQL 的默认选项?

InnoDB 存储引擎提供了一种强大和可靠的方式来处理事务。它具有许多特性,例如 ACID 兼容事务支持、行级锁定和实际实现,例如外键,使其成为 MySQL 的默认引擎。

此外,InnoDB 提供了崩溃恢复功能并提供硬件加速,例如固态硬盘 (SSD) 或硬盘。

简而言,InnoDB 的优势在于其广泛适用的特性集,包括事务、可靠性和性能优化,适合大多数工作负载。

主题1.8 — 复习和评估

在本课程中,我们已经讨论了:

  • 事务 的重要性在维护数据完整性,
  • MySQL 如何支持事务并为其提供好处,
  • InnoDB 的介绍、其优势和为什么它是 MySQL 的默认存储引擎,
  • InnoDB 和 MyISAM 之间的差异,
  • 在实际场景中,数据完整性和事务的重要性,
  • 并提供了一些常见的 MySQL 面试问题和答案。

为了复习,我将提供一组问题和问题,它们将从简单到复杂,所以请思考深入地。

问题 1 (3/10 难度):

ACID 是事务的四个属性的缩写,它们是什么?

问题 2 (6/10 难度):

为什么事务在数据库中的数据完整性方面重要?

问题 3 (9/10 难度):

为什么 InnoDB 是 MySQL 的默认选项,并在哪些方面优于 MyISAM?在回答中包含 InnoDB 的好处。

English post: https://programmerscareer.com/mysql-interview14/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

MySQL 面试:聚簇索引和非聚簇索引有什么区别? MySQL 面试:数据库的事务隔离级别有哪些?各有哪些优缺点

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×