数据库事务

ACID

在 MySQL 中,事务(Transaction) 是一组由一个或多个 SQL 语句组成的操作序列,这些操作要么全部成功,要么全部失败,即具有“原子性”。事务的主要作用是确保数据库在并发操作或系统故障时保持数据的一致性。

事务的四大特性(ACID)

事务有四个重要的特性,通常简称为 ACID,分别是:

  1. 原子性(Atomicity)

    • 含义:事务中的所有操作要么全部执行成功,要么全部回滚到事务开始之前的状态。即,事务是一个不可分割的单位。
    • 示例:假设在一个银行转账操作中,从账户 A 转账到账户 B 包含两步操作:从 A 中扣款、向 B 中加款。这两步操作必须都成功,否则应撤销已执行的操作,保证账户余额的一致性。
  2. 一致性(Consistency)

    • 含义:事务执行前后,数据库的状态必须保持一致。也就是说,事务执行完毕后,数据库应保持所有业务规则和约束的完整性。
    • 示例:在转账操作中,执行完事务后,账户 A 和 B 的余额变化应该满足转账金额的关系,即总金额不变。
  3. 隔离性(Isolation)

    • 含义:事务的隔离性保证了在事务执行过程中,其他事务不能看到未提交的数据。即,多个事务并发执行时,各自的操作互不干扰,事务的中间状态对其他事务是不可见的。
    • 示例:在一个事务修改了一个账户余额,但未提交时,另一个查询该账户余额的事务应看到的是事务开始前的余额,而不是中间状态。
  4. 持久性(Durability)

    • 含义:一旦事务提交,其对数据库的修改就会被永久保存,即使数据库崩溃或出现系统故障,也不会丢失已提交的事务数据。
    • 示例:当转账操作提交成功后,即使服务器突然断电,再次启动后,数据库应当仍然能反映出转账操作的结果。

事务的使用

在 MySQL 中,事务主要用于处理需要保证数据一致性的场景,特别是涉及多个表或多个操作的场合。你可以通过以下语句来控制事务:

  • 开启事务

    1
    START TRANSACTION;

    或者:

    1
    BEGIN;
  • 提交事务(将所有更改保存到数据库中):

    1
    COMMIT;
  • 回滚事务(撤销所有未提交的更改):

    1
    ROLLBACK;

事务的示例

假设我们有两个账户表 accounts,并想进行一次转账操作:

1
2
3
4
5
6
7
8
9
10
START TRANSACTION;

-- 从账户 A 扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 向账户 B 添加 100 元
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 提交事务
COMMIT;

如果在转账过程中发生了错误,导致某一步操作失败,你可以选择回滚事务:

1
2
3
4
5
6
7
START TRANSACTION;

-- 从账户 A 扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 发生错误,无法完成后续操作
ROLLBACK;

通过回滚操作,账户 A 的余额会恢复到扣除 100 元之前的状态,保证了事务的原子性和一致性。

事务的应用场景

  • 银行转账:确保资金从一个账户扣除,同时另一个账户增加,否则回滚操作。
  • 订单处理:在电子商务应用中,创建订单、扣库存、生成支付记录等操作必须作为一个整体,要么全部成功,要么全部失败。
  • 数据迁移:在数据批量迁移过程中,确保所有数据的迁移操作成功,如果某条数据迁移失败,可以选择回滚整个迁移操作。

数据库事务
https://weihehe.top/2024/08/27/数据库事务/
作者
weihehe
发布于
2024年8月27日
许可协议