MySQL面试: 简述数据库中的 ACID 分别是什么?

我将为学习MySQL准备一个主题概述,特别关注数据库中的ACID属性。

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

主题:1.1 ACID 理论

ACID(原子性、一致性、隔离性和持久性)是一个缩写词,用于定义一组属性,确保数据库操作的可靠处理,尤其是在事务模型中。

ACID的元素代表:

  • 原子性:这意味着事务必须被视为一个单位,它要么完全成功,要么完全失败。如果事务中的任何部分失败,则整个事务失败,并且在事务期间所做的更改被回滚(返回到其前一个状态)。
  • 一致性:一致性确保事务将数据库从一个有效状态带到另一个有效状态。它不允许事务将数据库留在一个不一致的状态。
  • 隔离性:隔离性确保事务安全地和独立地在同一时间内处理,而不会相互影响。
  • 持久性:名字所暗示的,持久性确保提交事务的结果或效果在未来的系统故障后仍然有效。

这些基本属性使数据库在所有事务中维持数据完整性和一致性。

主题:1.2 ACID 实践

ACID属性在MySQL数据库中极其重要,确保数据的可靠性和完整性。现在,让我们看看它们在实践中是如何工作的。

  • 原子性:MySQL 通过事务来确保原子性。在MySQL数据库中,事务是一组SQL语句,以单一的单位执行。这意味着事务中的所有SQL语句都要么全部执行,要么全部不执行。如果在事务过程中发生任何故障,则在事务期间所做的更改被回滚,并将数据库返回到其前一个状态。
  • 一致性:MySQL中的一致性属性确保只有遵循所有规则和约束的有效数据被写入数据库。如果事务导致无效数据,则整个事务被回滚,数据库保持不变。这确保了数据库从一个有效状态到另一个有效状态的过渡。
  • 隔离:在MySQL中,并发事务与其他事务隔离。这意味着事务的执行不会影响其他事务的执行。MySQL使用锁和不同的隔离级别来实现隔离。这防止了脏读、不可重复读和幻影读等问题。
  • 持久性:MySQL通过在事务成功之前将更改永久写入磁盘存储来确保持久性。这意味着一旦用户收到事务成功的通知,他们就可以确信事务已经永久记录并且在任何后续服务器故障或重启之后都会存在。

了解这些时,重要的是要注意MySQL允许您根据应用程序的需求定义事务边界,提供不同的配置选项。

主题:1.3 MySQL中的原子性

原子性是ACID数据库系统中的关键属性。它确保事务被视为一个单位的工作单元,要么完全成功,要么完全失败。没有一个事务被留在部分完成的状态。

在MySQL中,事务通常包含多个SQL命令。原子性保证,如果发生电源故障、系统崩溃或网络问题,那么事务执行后的命令被撤销。这就好像事务从未发生过一样。另一方面,如果所有事务中的命令都成功执行,则认为事务成功提交到数据库。

以下是MySQL事务中原子性的示例:

假设我们运营一家书店,我们正在更新库存和销售记录中的书籍数量。事务可能类似于以下内容:

1
2
3
4
START TRANSACTION;  
UPDATE Inventory SET Quantity = Quantity - 1 WHERE BookID = 100;
UPDATE Sales SET TotalSold = TotalSold + 1 WHERE BookID = 100;
COMMIT

在这个事务中,我们有两个UPDATE语句。这两个语句都要成功,以便事务成功提交。如果例如由于系统崩溃或网络错误,则整个事务由于原子性原则被回滚,确保我们的库存和销售记录保持一致。

原子性是一个强大的属性,确保我们的数据库操作是安全可靠的。

主题:1.4 数据库中的一致性

数据库系统中的一致性确保数据库事务将系统从一个一致状态带到另一个一致状态。这意味着如果执行一个违反数据库一致性规则的事务,整个事务将被回滚,并且数据库将保持不变。

在MySQL中,一致性由约束系统保留。约束是对表中列的规则,防止无效数据被输入到它们。有几种约束类型,包括:

  • 唯一约束:这确保所有列中的值都是唯一的。
  • 主键约束:这唯一地标识表中的每一条记录。
  • 外键约束:这维护引用完整性,确保两个表之间的链接是有效的。
  • 不为空约束:这确保列不能有NULL值。
  • 检查约束:这确保所有列中的值满足特定条件。

以下是一个示例,展示了唯一约束如何确保一致性:

1
2
3
4
5
6
7
CREATE TABLE Employees (  
ID int NOT NULL,
Name varchar(255) NOT NULL,
Age int,
PRIMARY KEY (ID),
UNIQUE (Name)
);

在上述示例中,UNIQUE (Name)约束确保了两个员工不能有相同的名字,从而促进了一致性。如果我们尝试插入两个具有相同名字的员工,MySQL将不允许这样做,并且数据库的一致性将得到保留。

主题:1.5 数据库中的隔离

隔离是ACID中的“I”,意味着每个事务都应该以与其他事务相隔离的方式进行。这意味着一个事务的执行不会影响其他事务的执行。在数据库中,隔离对于防止在事务同时执行时可能出现的一些问题非常重要。

在MySQL中,并发事务由一个特定的机制称为锁定管理。MySQL提供了多种锁类型,包括共享锁(读锁)和独占锁(写锁)。锁的类型取决于事务是读还是写。

MySQL还支持多个隔离级别,包括:

  • 未提交读:最低级别的隔离。事务可以看到其他事务中未提交的更改,通常导致问题如脏读。
  • 已提交读:与其他事务相比,隔离级别较高。事务只能看到其他事务已提交的更改。
  • 可重复读:MySQL中的默认隔离级别。保证单个事务内的所有读取都会返回相同的数据,即使在事务期间发生更改。
  • 可序列化:最高级别的隔离。事务以串行方式执行,即一次只执行一个事务。

以下是隔离在MySQL中的一个示例:

1
2
3
4
5
6
7
8
9
-- 开始一个事务  
START TRANSACTION;
-- 读取数据
SELECT * FROM table_name WHERE condition;
-- 尝试再次读取相同数据将返回相同的结果,
-- 无论其他事务是否对数据进行更改
SELECT * FROM table_name WHERE condition;
-- 提交事务
COMMIT;

在上述示例中,在可重复读隔离级别下,两个SELECT语句将返回相同的结果,即使其他事务对数据进行更改,因为其他事务对数据的更改在事务提交之前不会对这个事务可见。

主题:1.6 数据库中的持久性

在数据库系统中,“持久性”(ACID中的“D”)关注一次事务成功提交后数据的持久性。如果事务已成功提交,持久性保证该事务所做的更改将在任何后续故障(如电源失败、系统崩溃或其他未预期的关机)后仍然存在。

MySQL 确保持久性,在事务更改被实际更改之前,先将所有事务更改写入二进制日志中。这个二进制日志作为历史记录,可以用来从任何时间点重建数据状态。

每次提交事务时,MySQL首先将该事务所做的更改写入二进制日志,然后MySQL开始实际执行更改。如果系统故障发生,MySQL可以回放二进制日志,直到上一个已提交事务,确保所有已提交事务的持久性。

让我们考虑一个更新表中的记录的例子:

1
2
3
START TRANSACTION;  
UPDATE Employees SET Salary = Salary + 5000 WHERE ID = 100;
COMMIT;

在上述事务中,员工薪资被更新。一旦COMMIT语句执行,更新将在二进制日志中立即写入,在实际更改之前。这确保了,即使在更新后的系统崩溃,该事务也不会丢失。

主题:1.7 在MySQL中的事务控制

事务控制是管理ACID属性的方法,并引用用于控制事务的操作和命令。在MySQL中,事务控制命令包括START TRANSACTION,COMMIT和ROLLBACK。

  • START TRANSACTION:标记事务的开始。
  • COMMIT:标记事务的结束,并永久保存自上次COMMIT或START TRANSACTION以来所做的任何更改。
  • ROLLBACK:撤销自上次COMMIT或START TRANSACTION以来所做的任何更改。

以下是在MySQL中的事务控制实际操作的示例:

1
2
3
4
5
6
7
8
9
10
11
-- 开始一个事务  
START TRANSACTION;
-- 将数据插入表中
INSERT INTO Customers (Name, Email) VALUES ('John Doe', 'johndoe@example.com');
-- 如果上述语句出现问题,我们可以撤销(反转)事务
ROLLBACK;
-- 现在让我们再试一次,这次没有错误
START TRANSACTION;
INSERT INTO Customers (Name, Email) VALUES ('John Doe', 'johndoe@example.com');
-- 由于一切顺利,我们现在可以提交事务(完成并保存我们的更改)
COMMIT;

在这个示例中,ROLLBACK语句用于反转一个包含错误的事务。一旦问题得到解决,事务再次尝试,并在成功时,COMMIT语句用于完成并保存更改。

事务控制帮助维护ACID属性,因为它为将一个或多个语句组合成一个事务提供了能力,从而提供了更大的控制权,确保数据完整性。

主题:1.8 在MySQL中的高级主题

了解ACID原则及其如何在MySQL中实现后,您可能还想探索更多高级主题,以提高您的MySQL专业知识。一些值得注意的领域包括但不限于:

  • 索引:MySQL中的索引用于加速从数据库中检索数据的速度。数据库中的索引与书中末尾的索引类似,它们帮助您更快地找到信息。
  • 存储过程:这些是预先编写的SQL语句,以名称存储并以单元形式执行。它们有助于避免重复编写经常需要的SQL代码。
  • 数据类型:MySQL具有多种数据类型,以适应各种数据。从字母数字字符串、日期和时间、数值到更复杂的数据类型,如JSON和空间数据类型都有在MySQL中的可用性。
  • 处理NULL值:MySQL数据库中的NULL值可能很困难。它们表示缺失或未知的数据。MySQL提供了多种函数,如IS NULL、IS NOT NULL、IFNULL()和COALESCE(),以处理NULL值。
  • 连接和联合:连接用于将两个或多个表的行组合在一起,基于相关列。它们在数据库中经常使用,因为很少有一个表中包含所有需要的数据。联合用于将两个或多个SELECT语句的结果集组合在一起。
  • 安全:处理用户权限和安全连接到MySQL数据库是任何数据库管理的重要部分。

**主题:**1.9 回顾和评估

这是我们在这些课程中学到的概述:

  1. 理论中的ACID: 我们学习了ACID属性(原子性、一致性、隔离性、持久性)及其在数据库系统中的重要性。
  2. 实践中的ACID: 我们超出了理论,了解如何在MySQL中实现这些属性,以及它们如何确保数据完整性和一致性。
  3. MySQL中的原子性: 我们探索了原子性,并通过实际示例了解了它如何确保数据库操作要么完全完成,要么不发生。
  4. MySQL中的一致性: 我们学习了MySQL如何确保数据在任何SQL操作之前和之后保持一致。
  5. MySQL中的隔离: 我们讨论了隔离的概念及其在并发数据库处理中的重要性。
  6. MySQL中的持久性: 我们学习了持久性在MySQL数据库中的含义,并观察了MySQL如何确保数据更改在任何后续故障后仍然存在。
  7. MySQL中的事务控制: 我们了解了如何使用事务控制在MySQL中管理ACID属性。我们主要了解了START TRANSACTION、COMMIT和ROLLBACK命令的使用。
  8. MySQL的高级主题: 我们深入了解更高级的主题,如索引、存储过程、数据类型等,以扩展我们对MySQL的理解。

我建议重新查看这些主题,并确保对它们有坚定的理解。

以下是测试您关于ACID属性和MySQL事务控制理解的一些评估问题:

问题1: 在MySQL中,什么是原子性?它在实践中如何实现?

问题2: 在MySQL中,一致性的含义是什么,以及MySQL如何确保数据在任何SQL操作之前和之后保持一致?

问题3: 如何在MySQL中,特别是在并发数据库处理期间,实现隔离?

问题4: 在MySQL中,持久性属性的含义是什么?

问题5: 在MySQL中,关于事务控制,讨论START TRANSACTION、COMMIT和ROLLBACK命令的重要性。

答案1:

在MySQL中,原子性表示一个事务必须被视为一个不可分割的单位,这意味着要么它完全完成,要么不执行。在实践中,MySQL通过START TRANSACTION、COMMIT和ROLLBACK命令实现原子性。如果事务被提交,则所做的更改都是永久的。如果事务被回滚,则没有任何更改。

答案2:

在MySQL中,一致性确保所有数据更改都将将数据库从一个有效状态带到另一个,维持数据库规则和完整性。MySQL使用多种机制来确保一致性。这些包括定义的表架构,预定义规则,触发器和约束,如主键,外键,唯一,不为空和检查约束。

答案3:

在MySQL中,隔离确保并发执行事务的结果使系统状态变为如果事务以顺序执行,即一次执行一个。MySQL通过多种隔离级别和锁定机制实现隔离。

答案4:

在MySQL中,持久性属性的含义是一旦事务被提交,它将保持不变,即使在系统故障,电源损失,崩溃或错误等情况下。这通常通过使用数据库备份和事务日志来实现,这些日志可以用于恢复数据库在故障发生前的状态。

答案5:

在MySQL中,START TRANSACTION表示操作的开始点。COMMIT表示当前事务中所做的更改被永久化。ROLLBACK表示如果在处理任何SQL命令时发生错误,则已执行的SQL命令将被撤销以维护数据库完整性。这些命令共同帮助在MySQL设置中管理ACID属性期间的事务。

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

MySQL 面试:数据库的事务隔离级别有哪些?各有哪些优缺点 MySQL 面试:MySQL 如何设计索引,如何优化查询?

评论

Your browser is out-of-date!

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

×