事务是数据库管理系统的核心特性,它确保数据库操作要么完全成功,要么完全失败,保持数据的一致性和完整性。
1、事务基础概念
1.1 什么是事务?
事务是一组原子性的 SQL 操作,这些操作要么全部执行成功,要么全部失败回滚。事务将数据库从一种一致状态转换为另一种一致状态。
1.2 ACID 特性
特性 |
描述 |
实现机制 |
原子性 (Atomicity) |
事务不可分割,要么全部成功,要么全部失败 |
Undo Log |
一致性 (Consistency) |
事务使数据库从一个有效状态转换到另一个有效状态 |
应用层 + 数据库约束 |
隔离性 (Isolation) |
并发事务相互隔离,互不干扰 |
锁机制 + MVCC |
持久性 (Durability) |
事务提交后,修改永久保存 |
Redo Log |
2、MySQL 事务操作
2.1 事务控制语句
-- 开启事务
START TRANSACTION; -- 或 BEGIN-- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;-- 设置保存点
SAVEPOINT savepoint_name;-- 回滚到保存点
ROLLBACK TO savepoint_name;-- 释放保存点
RELEASE SAVEPOINT savepoint_name;
2.2 事务模式设置
-- 查看事务自动提交状态
SHOW VARIABLES LIKE 'autocommit'; -- 默认ON-- 禁用自动提交
SET autocommit = 0;-- 启用自动提交
SET autocommit = 1;
2.3 完整事务示例
START TRANSACTION;-- 账户A扣款
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';-- 账户B收款
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';-- 验证余额
SELECT balance FROM accounts WHERE account_id = 'A' FOR UPDATE;-- 根据业务逻辑决定提交或回滚
IF (SELECT balance FROM accounts WHERE account_id = 'A') >= 0 THENCOMMIT;
ELSEROLLBACK;
END IF;
3、事务隔离级别
3.1 并发问题
问题 |
描述 |
示例 |
脏读 |
读取到未提交的数据 |
事务A读取事务B未提交的修改 |
不可重复读 |
同一事务内多次读取结果不同 |
事务A两次读取间数据被事务B修改 |
幻读 |
同一查询返回不同行数 |
事务A查询期间事务B插入新行 |
3.2 隔离级别对比
隔离级别 |
脏读 |
不可重复读 |
幻读 |
性能 |
实现机制 |
READ UNCOMMITTED |
❌ |
❌ |
❌ |
最高 |
无锁 |
READ COMMITTED |
✅ |
❌ |
❌ |
高 |
行锁 |
REPEATABLE READ (MySQL默认) |
✅ |
✅ |
❌ |
中 |
MVCC+间隙锁 |
SERIALIZABLE |
✅ |
✅ |
✅ |
最低 |
表锁 |
3.3 设置隔离级别
-- 查看当前隔离级别
SELECT @@transaction_isolation;-- 设置会话级隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 设置全局级隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;