MySQL 事务
1. 事务的概念
事务(Transaction)是数据库操作的最小逻辑单元,由一组 SQL 语句组成。事务具有 ACID 特性:
- 原子性(Atomicity):事务要么全部执行成功,要么全部失败回滚。
- 一致性(Consistency):事务执行前后,数据库状态保持一致(如约束、触发器等)。
- 隔离性(Isolation):多个事务并发执行时,互不干扰。
- 持久性(Durability):事务提交后,修改永久保存到数据库。
2. 事务控制语句
START TRANSACTION
或BEGIN
:显式开启事务。COMMIT
:提交事务,永久保存修改。ROLLBACK
:回滚事务,撤销所有未提交的操作。SAVEPOINT
:设置保存点,允许部分回滚。
3. 事务示例
示例 1:转账操作(原子性)
START TRANSACTION;
-- 账户 A 扣款 100
UPDATE account SET balance = balance - 100 WHERE user_id = 'A';
-- 账户 B 收款 100
UPDATE account SET balance = balance + 100 WHERE user_id = 'B';
-- 检查是否出错
IF (无错误) THEN
COMMIT; -- 提交事务
ELSE
ROLLBACK; -- 回滚事务
END IF;
示例 2:订单与库存一致性
START TRANSACTION;
-- 插入订单记录
INSERT INTO orders (order_id, product_id, quantity) VALUES (1001, 1, 2);
-- 减少库存
UPDATE products SET stock = stock - 2 WHERE product_id = 1;
-- 若库存不足或其他错误
IF (库存 < 0) THEN
ROLLBACK; -- 回滚,取消订单和库存修改
ELSE
COMMIT; -- 提交事务
END IF;
示例 3:保存点(Partial Rollback)
START TRANSACTION;
INSERT INTO logs (message) VALUES ('Step 1');
SAVEPOINT step1;
INSERT INTO logs (message) VALUES ('Step 2');
SAVEPOINT step2;
-- 回滚到 step1,撤销 Step 2 的操作
ROLLBACK TO step1;
COMMIT; -- 最终只有 Step 1 被提交
4. 事务隔离级别
MySQL 支持 4 种隔离级别(默认是 REPEATABLE READ
):
- READ UNCOMMITTED:可能读到未提交的数据(脏读)。
- READ COMMITTED:只能读到已提交的数据。
- REPEATABLE READ(默认):保证同一事务多次读取结果一致。
- SERIALIZABLE:完全串行化,避免并发问题。
设置隔离级别:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
5. 注意事项
- 隐式提交:部分语句(如
ALTER TABLE
)会自动提交当前事务。 - 避免长事务:长时间未提交的事务可能导致锁竞争和性能问题。
- 死锁处理:MySQL 会自动检测死锁并回滚其中一个事务。
通过事务,可以确保复杂操作的可靠性和数据一致性,尤其在金融、电商等高并发场景中至关重要。