授课语音

MySQL 中的 ACID 特性

ACID 特性是关系型数据库事务的重要原则,确保数据库的事务处理具备可靠性和一致性。ACID 代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性共同保证了数据库事务的可靠执行。


1. 原子性(Atomicity)

原子性意味着一个事务要么全部完成,要么全部不完成。如果事务中的任何操作失败,系统会回滚到事务开始前的状态,确保没有半完成的操作。

举例:

假设我们在银行系统中进行一次转账操作:

  1. 从账户A中扣款
  2. 将款项存入账户B

如果在执行过程中出现问题(如网络中断或系统崩溃),系统会保证要么两步都成功,要么两步都不发生。

START TRANSACTION;

-- 从账户A扣款100
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

-- 向账户B存款100
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

-- 提交事务
COMMIT;

如果在 UPDATE 语句执行后但 COMMIT 之前系统崩溃,系统会回滚到事务开始前的状态。


2. 一致性(Consistency)

一致性指的是事务必须使数据库从一个一致性状态变到另一个一致性状态。换句话说,事务必须遵循数据库的约束(如主键约束、外键约束等),在事务开始前后数据库的数据应该是有效的。

举例:

在银行转账的例子中,转账操作不能导致账户的负余额或违反其他业务规则。

START TRANSACTION;

-- 扣款
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

-- 存款
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

-- 检查账户余额是否有效
SELECT balance FROM accounts WHERE account_id = 'A';  -- 确保余额 >= 0

COMMIT;

如果 balance 为负数,系统应回滚事务。


3. 隔离性(Isolation)

隔离性意味着事务的执行不应受到其他事务的干扰。事务的执行过程对于其他事务来说是不可见的,事务的中间状态不能被其他事务访问。

MySQL 提供了多种隔离级别,可以根据业务需求选择适合的隔离级别:

  • READ UNCOMMITTED:允许读取未提交的数据(最低隔离级别)。
  • READ COMMITTED:只能读取已提交的数据。
  • REPEATABLE READ:在事务中多次读取同一数据,结果相同。
  • SERIALIZABLE:完全隔离,事务串行执行。

举例:

REPEATABLE READ 隔离级别下,如果一个事务正在读取数据,其他事务不能修改这些数据,直到第一个事务完成。

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

-- 读取账户A余额
SELECT balance FROM accounts WHERE account_id = 'A';

-- 此时,其他事务不能修改账户A的余额,直到当前事务提交

COMMIT;

4. 持久性(Durability)

持久性意味着一旦事务提交,它所做的修改会永久保存在数据库中,即使系统崩溃也不会丢失。

举例:

在银行转账操作中,一旦提交事务,无论系统如何崩溃,扣款和存款操作的结果都会保存下来。

START TRANSACTION;

-- 扣款
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

-- 存款
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

-- 提交事务
COMMIT;

即使在 COMMIT 后,系统崩溃,数据库也会保证这笔交易的状态被持久化。


总结

ACID 特性是数据库事务处理的核心,确保了事务的可靠性和数据一致性。理解并应用这些特性,能够帮助我们设计更稳定和健壮的数据库系统。

去1:1私密咨询

系列课程: