【MySQL】提高篇—事务管理:事务的概念与ACID特性(面试高频)

在关系数据库中,事务是指一组操作的集合,这些操作要么全部成功执行,要么全部不执行。事务的引入是为了确保数据库在处理多个操作时的一致性和完整性。

在实际应用中,事务广泛应用于银行转账、订单处理等场景中。

例如,在一个银行转账的场景中,用户从账户A转账到账户B,这个操作实际上包括两个步骤:

  1. 从账户A中扣除金额。

  2. 向账户B中增加金额。

如果在执行过程中发生错误,比如系统崩溃或网络故障,可能导致账户A的金额被扣除,但账户B的金额没有增加。

为了避免这种不一致的情况,数据库使用事务来确保这两个操作要么同时成功,要么同时失败。

事务具有四个基本特性,通常称为ACID特性。接下来,我们将详细介绍这些特性,并通过具体的示例进行说明。

1. 原子性 (Atomicity)

原子性保证事务中的所有操作要么全部完成,要么全部不执行。即使在事务执行过程中发生错误,数据库也会回滚到事务开始之前的状态。

示例

假设我们有一个简单的银行账户表 accounts

-- 创建 accounts 表
CREATE TABLE accounts (
    account_id INT PRIMARY KEY,
    balance DECIMAL(10, 2) NOT NULL
);

-- 插入示例数据
INSERT INTO accounts (account_id, balance) VALUES (1, 1000.00), (2, 500.00);

现在我们来模拟一个转账操作:

-- 开始事务
START TRANSACTION;

-- 从账户1扣除100.00
UPDATE accounts SET balance = balance - 100.00 WHERE account_id = 1;

-- 向账户2增加100.00
UPDATE accounts SET balance = balance + 100.00 WHERE account_id = 2;

-- 提交事务
COMMIT;

解释

  • START TRANSACTION:开始一个新的事务。

  • 第一个 UPDATE 语句从账户1中扣除100.00。

  • 第二个 UPDATE 语句向账户2中增加100.00。

  • COMMIT:提交事务,如果在此之前发生错误,可以使用 ROLLBACK 回滚到事务开始之前的状态。

2. 一致性 (Consistency)

一致性确保事务在执行前后,数据库的状态都是一致的。事务的执行不会破坏数据库的完整性约束。

示例

继续使用上面的转账示例,如果在转账过程中,账户余额不能为负数,那么我们需要在执行更新时进行检查。

-- 开始事务
START TRANSACTION;

-- 从账户1扣除100.00
UPDATE accounts SET balance = balance - 100.00 WHERE account_id = 1;

-- 检查账户1的余额是否为负
IF (SELECT balance FROM accounts WHERE account_id = 1) < 0 THEN
    -- 回滚事务
    ROLLBACK;
    -- 提示余额不足
    SELECT 'Insufficient balance' AS error_message;
ELSE
    -- 向账户2增加100.00
    UPDATE accounts SET balance = balance + 100.00 WHERE account_id = 2;
    -- 提交事务
    COMMIT;
END IF;

解释

  • 在从账户1扣除金额后,我们检查账户1的余额是否为负。如果余额不足,则使用 ROLLBACK 回滚事务,保持数据库的一致性。

3. 隔离性 (Isolation)

隔离性确保并发执行的事务不会相互影响。即使多个事务同时执行,最终的结果也应该和串行执行的结果相同。

示例

考虑两个用户同时进行转账操作。我们需要确保每个事务的操作不会干扰其他事务。

-- 用户1转账
START TRANSACTION;
UPDATE accounts SET balance = balance - 100.00 WHERE account_id = 1;
-- 假设此时用户2也在进行转账
-- 用户2转账
START TRANSACTION;
UPDATE accounts SET balance = balance - 50.00 WHERE account_id = 1;
-- 提交用户1的事务
COMMIT;
-- 提交用户2的事务
COMMIT;

解释

  • 在用户1和用户2同时进行转账操作时,数据库管理系统会使用锁机制来确保每个事务的隔离性。即使用户2在用户1未提交前也尝试修改账户1的余额,数据库会确保用户1的操作完成后再执行用户2的操作,从而避免数据不一致。

4. 持久性 (Durability)

持久性确保一旦事务提交,其结果将永久保存到数据库中,即使系统崩溃或发生故障,已提交的事务数据也不会丢失。

示例

继续使用转账的示例:

-- 开始事务
START TRANSACTION;

-- 从账户1扣除100.00
UPDATE accounts SET balance = balance - 100.00 WHERE account_id = 1;

-- 向账户2增加100.00
UPDATE accounts SET balance = balance + 100.00 WHERE account_id = 2;

-- 提交事务
COMMIT;

解释

  • COMMIT 之后,数据库将确保所有更改被写入到磁盘。如果系统崩溃,已提交的转账操作不会丢失,确保了数据的持久性。

总结

通过本节的示例,您应该能够理解事务的概念及其ACID特性:

  1. **原子性 (Atomicity)**:确保事务中的所有操作要么全部成功,要么全部不执行。

  2. **一致性 (Consistency)**:确保事务执行前后数据库的状态是一致的。

  3. **隔离性 (Isolation)**:确保并发执行的事务不会相互影响。

  4. **持久性 (Durability)**:确保一旦事务提交,其结果将永久保存到数据库中。

这些特性在实际应用中构建可靠和高效的数据库系统,确保数据的一致性和完整性。

上一篇:基于模型设计的智能平衡移动机器人-基础实验SCI


下一篇:M1 Mac打开Jupyter notebook