MySQL-事务

36 阅读3分钟

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 隔离级别;

五、关键注意事项

  1. 仅 DML 操作(INSERT/UPDATE/DELETE)支持事务,DDL(建表 / 删表)、DCL(授权)操作会自动提交事务,无法回滚。

  2. 事务尽量短小:长事务会占用锁资源,导致并发性能下降,甚至死锁。

  3. 死锁避免:统一事务加锁顺序(如先锁 A 表再锁 B 表)、减少锁持有时间。

  4. 持久性依赖:redo log(重做日志)保证提交后数据不丢失,undo log(回滚日志)支持回滚操作。

  5. 可重复读级别中的临键锁能解决大多数幻读,但是他本身是为了解决“不可重复读”问题的,不承诺“防幻读”