MySQL 事务笔记
一、核心定义
事务是一组不可分割的DML操作(增 / 删 / 改),遵循「要么全部执行成功(提交),要么全部执行失败(回滚)」的原则,保证数据一致性。
MYSQL中仅InnoDB存储引擎支持事务
二、⭐ACID 核心特性
| 特性 | 说明 |
|---|---|
| 原子性(A) | 事务是最小执行单元,不可拆分,操作要么全完成,要么全回滚。 |
| 一致性(C) | 事务执行前后,数据始终符合业务规则(如转账后总金额不变)。 |
| 隔离性(I) | 多个事务并发执行时,相互隔离,互不干扰(避免脏读、不可重复读等问题)。 |
| 持久性(D) | 事务提交后,数据永久写入磁盘,即使数据库崩溃也不会丢失。 |
三、事务控制语句
-- 1. 开启事务(二选一)
START TRANSACTION; -- 推荐
BEGIN;
-- 2. 执行DML操作(核心业务逻辑)
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
-- 3. 提交事务(数据永久生效)
COMMIT;
-- 4. 回滚事务(撤销所有未提交操作)
ROLLBACK;
-- 5. 局部回滚(保存点)
SAVEPOINT sp1; -- 创建保存点
UPDATE account SET balance = balance - 50 WHERE id = 1;
ROLLBACK TO SAVEPOINT sp1; -- 回滚到保存点(仅撤销保存点后操作)
COMMIT;
-- 6. 关闭自动提交(默认ON,执行DML自动提交)
SET AUTOCOMMIT = OFF; -- 需手动COMMIT/ROLLBACK
四、事务隔离级别
1. 并发问题(隔离性不足导致)
并发的事务会导致三个并发问题
-
脏读:读取到其他事务未提交的「临时数据」(可能回滚)。
-
不可重复读:同一事务内,多次读取同一数据结果不同(其他事务提交修改)。
-
幻读:同一事务内,多次查询返回的记录行数不同(其他事务提交插入 / 删除)。
2. 隔离级别(从低到高)
-
隔离级别从低到高分别为:读未提交,读已提交,可重复读,串行化
-
其运行效率与隔离级别相反,即隔离级别越高,运行效率越低
-
MYSQL默认的隔离级别为:可重复读RR
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✔️ | ✔️ | ✔️ |
| READ COMMITTED | ❌ | ✔️ | ✔️ |
| REPEATABLE READ | ❌ | ❌ | ❌ |
| SERIALIZABLE | ❌ | ❌ | ❌ |
其中 ✔️ 为会发生, ❌ 为不会发生
3. 级别操作语句
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置会话级隔离级别(仅当前连接生效)
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
-- 设置全局隔离级别(需重启MySQL生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
五、关键注意事项
-
仅 DML 操作(INSERT/UPDATE/DELETE)支持事务,DDL(建表 / 删表)、DCL(授权)操作会自动提交事务,无法回滚。
-
事务尽量短小:长事务会占用锁资源,导致并发性能下降,甚至死锁。
-
死锁避免:统一事务加锁顺序(如先锁 A 表再锁 B 表)、减少锁持有时间。
-
持久性依赖:redo log(重做日志)保证提交后数据不丢失,undo log(回滚日志)支持回滚操作。
-
可重复读级别中的临键锁能解决大多数幻读,但是他本身是为了解决“不可重复读”问题的,不承诺“防幻读”