📌 目录
- MySQL 事务概述
- 事务的四大特性(ACID)
- MySQL 事务的使用
- 事务控制语句
START TRANSACTION
COMMIT
ROLLBACK
SAVEPOINT
和ROLLBACK TO SAVEPOINT
- MySQL 隐式与显式事务
- 事务与存储引擎的关系
- MySQL 事务的示例
- 事务的最佳实践
- 参考资料
MySQL 事务概述
事务(Transaction) 是指一组 SQL 语句的集合,这些语句要么全部执行成功(提交 COMMIT
),要么全部回滚(ROLLBACK
)。事务通常用于确保数据库操作的完整性和一致性,特别是在涉及多个 SQL 操作的情况下,例如银行转账、订单处理等。
📌 事务的典型应用场景:
- 银行转账(确保转出和转入操作要么全部成功,要么全部回滚)。
- 订单处理(确保库存扣减、支付成功、订单创建同步完成)。
- 财务计算(防止部分操作成功,导致账目不一致)。
事务的四大特性(ACID)
ACID 是数据库事务的四大特性:
特性 | 描述 |
---|---|
A(Atomicity,原子性) | 事务是一个不可分割的最小执行单元,要么全部成功,要么全部失败。 |
C(Consistency,一致性) | 事务执行后,数据库仍然保持一致的状态,不会破坏数据的完整性。 |
I(Isolation,隔离性) | 并发事务之间相互独立,不会互相干扰。 |
D(Durability,持久性) | 事务一旦提交,对数据库的修改是永久性的,即使系统崩溃也不会丢失数据。 |
MySQL 事务的使用
1️⃣ 事务控制语句
语句 | 作用 |
---|---|
START TRANSACTION 或 BEGIN | 开启事务 |
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 语句都会进入事务,直到手动 COMMIT
或 ROLLBACK
。
MySQL 隐式与显式事务
事务类型 | 描述 |
---|---|
隐式事务 | MySQL 默认开启 AUTOCOMMIT = 1 ,每条 SQL 语句自动提交。 |
显式事务 | 通过 START TRANSACTION 开启,需手动 COMMIT 或 ROLLBACK 。 |
事务与存储引擎的关系
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
。
参考资料
🚀 事务是数据库操作中的关键概念,掌握事务管理可以大大提高数据一致性和安全性。如果你有更复杂的业务需求,欢迎讨论!
发表回复