📌 目录

  1. MySQL 事务概述
  2. 事务的四大特性(ACID)
  3. MySQL 事务的使用
  4. 事务控制语句
    • START TRANSACTION
    • COMMIT
    • ROLLBACK
    • SAVEPOINTROLLBACK TO SAVEPOINT
  5. MySQL 隐式与显式事务
  6. 事务与存储引擎的关系
  7. MySQL 事务的示例
  8. 事务的最佳实践
  9. 参考资料

MySQL 事务概述

事务(Transaction) 是指一组 SQL 语句的集合,这些语句要么全部执行成功(提交 COMMIT),要么全部回滚(ROLLBACK)。事务通常用于确保数据库操作的完整性和一致性,特别是在涉及多个 SQL 操作的情况下,例如银行转账、订单处理等。

📌 事务的典型应用场景:

  • 银行转账(确保转出和转入操作要么全部成功,要么全部回滚)。
  • 订单处理(确保库存扣减、支付成功、订单创建同步完成)。
  • 财务计算(防止部分操作成功,导致账目不一致)。

事务的四大特性(ACID)

ACID 是数据库事务的四大特性:

特性描述
A(Atomicity,原子性)事务是一个不可分割的最小执行单元,要么全部成功,要么全部失败。
C(Consistency,一致性)事务执行后,数据库仍然保持一致的状态,不会破坏数据的完整性。
I(Isolation,隔离性)并发事务之间相互独立,不会互相干扰。
D(Durability,持久性)事务一旦提交,对数据库的修改是永久性的,即使系统崩溃也不会丢失数据。

MySQL 事务的使用

1️⃣ 事务控制语句

语句作用
START TRANSACTIONBEGIN开启事务
COMMIT提交事务(保存更改)
ROLLBACK回滚事务(撤销更改)
SAVEPOINT创建事务的保存点
ROLLBACK TO SAVEPOINT回滚到某个保存点
SET AUTOCOMMIT = 0关闭自动提交

事务控制语句

1️⃣ START TRANSACTION(开始事务)

START TRANSACTION;
-- 或者
BEGIN;

📌 作用:显式开启事务,使后续 SQL 语句受事务控制。

2️⃣ COMMIT(提交事务)

COMMIT;

📌 作用:提交事务,所有更改永久生效

3️⃣ ROLLBACK(回滚事务)

ROLLBACK;

📌 作用:撤销事务中的所有操作,数据库状态回到事务开始前。

4️⃣ SAVEPOINT(创建事务保存点)

SAVEPOINT savepoint_name;

📌 作用:在事务中创建一个保存点,允许部分回滚。

5️⃣ ROLLBACK TO SAVEPOINT(回滚到保存点)

ROLLBACK TO SAVEPOINT savepoint_name;

📌 作用:回滚到特定的保存点,而不回滚整个事务

6️⃣ 关闭自动提交

SET AUTOCOMMIT = 0;  -- 关闭自动提交
SET AUTOCOMMIT = 1;  -- 开启自动提交(默认值)

📌 作用:关闭 AUTOCOMMIT 后,所有 SQL 语句都会进入事务,直到手动 COMMITROLLBACK


MySQL 隐式与显式事务

事务类型描述
隐式事务MySQL 默认开启 AUTOCOMMIT = 1,每条 SQL 语句自动提交
显式事务通过 START TRANSACTION 开启,需手动 COMMITROLLBACK

事务与存储引擎的关系

MySQL 事务仅适用于 InnoDB 存储引擎MyISAM 不支持事务

存储引擎是否支持事务
InnoDB✅ 支持
MyISAM❌ 不支持
MEMORY❌ 不支持
NDB✅ 支持
ARCHIVE❌ 不支持

📌 建议:在涉及事务的表中使用 InnoDB 存储引擎:

CREATE TABLE accounts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    balance DECIMAL(10,2)
) ENGINE=InnoDB;


MySQL 事务的示例

示例 1:银行转账

假设 Alice 给 Bob 转账 500 元,事务过程如下:

START TRANSACTION;

-- Alice 扣款
UPDATE accounts SET balance = balance - 500 WHERE name = 'Alice';

-- Bob 收款
UPDATE accounts SET balance = balance + 500 WHERE name = 'Bob';

-- 提交事务
COMMIT;

📌 如果 Alice 账户余额不足,则回滚事务

START TRANSACTION;

UPDATE accounts SET balance = balance - 500 WHERE name = 'Alice';
IF (SELECT balance FROM accounts WHERE name = 'Alice') < 0 THEN
    ROLLBACK;
ELSE
    UPDATE accounts SET balance = balance + 500 WHERE name = 'Bob';
    COMMIT;
END IF;

示例 2:订单系统

START TRANSACTION;

-- 1. 扣减库存
UPDATE products SET stock = stock - 1 WHERE product_id = 101;

-- 2. 生成订单
INSERT INTO orders (order_id, user_id, product_id) VALUES (1001, 1, 101);

-- 3. 记录支付
INSERT INTO payments (order_id, amount) VALUES (1001, 99.99);

-- 提交事务
COMMIT;


事务的最佳实践

1. 在 InnoDB 上使用事务,避免 MyISAM
2. 避免长事务(长时间持有事务会锁表,影响性能)。
3. 事务中尽量减少 SELECT 语句,减少锁的持有时间。
4. 使用 SAVEPOINT 进行部分回滚,提高灵活性。
5. 在事务提交前,确保所有更新都符合业务逻辑,避免不必要的 ROLLBACK


参考资料


🚀 事务是数据库操作中的关键概念,掌握事务管理可以大大提高数据一致性和安全性。如果你有更复杂的业务需求,欢迎讨论!