1. 事务基础与ACID特性
什么是事务?
事务是数据库管理系统中的逻辑工作单元,由一个或多个SQL操作组成,这些操作要么全部成功执行,要么全部失败回滚。
ACID特性及实现原理
| 特性 |
描述 |
InnoDB实现原理 |
| 原子性(Atomicity) |
事务的所有操作要么全部完成,要么全部不执行 |
通过undo log实现:事务开始前将数据副本保存到undo log,失败时进行回滚 |
| 一致性(Consistency) |
事务使数据库从一个一致状态转变到另一个一致状态 |
由其他三个特性共同保证,通过约束、触发器等机制维护业务规则 |
| 隔离性(Isolation) |
并发事务之间相互隔离,互不干扰 |
通过MVCC和锁机制实现,提供不同级别的隔离保证 |
| 持久性(Durability) |
事务提交后,对数据的修改是永久性的 |
通过redo log实现:采用WAL技术,先写日志后写数据 |
事务类型对比
| 类型 |
控制方式 |
语法示例 |
使用场景 |
| 显式事务 |
手动控制开始和结束 |
START TRANSACTION; → DML操作 → COMMIT;/ROLLBACK; |
需要多个操作原子性执行的业务逻辑 |
| 隐式事务 |
自动提交单条语句 |
SET AUTOCOMMIT=1; → SQL语句(自动提交) |
简单的单条数据修改操作 |
2. SQL语句加锁机制
| 语句类型 |
加锁情况 |
锁类型 |
详细说明 |
| INSERT |
✅ 加锁 |
排它锁(X锁) |
对新插入的行加排它锁 |
| DELETE |
✅ 加锁 |
排它锁(X锁) |
对要删除的行加排它锁 |
| UPDATE |
✅ 加锁 |
排它锁(X锁) |
对修改的行加排它锁 |
| 快照读 |
❌ 不加锁 |
无 |
通过MVCC读取历史版本 |
| 当前读 |
✅ 加锁 |
S锁或X锁 |
SELECT...LOCK IN SHARE MODE(S锁)
SELECT...FOR UPDATE(X锁) |
3. 快照读与当前读对比
| 特性 |
快照读 |
当前读 |
| 语法示例 |
SELECT * FROM products |
SELECT * FROM products FOR UPDATE |
| 读取数据 |
历史版本数据 |
最新提交数据 |
| 加锁情况 |
不加锁 |
加共享锁或排它锁 |
| 并发性能 |
高,无阻塞 |
低,可能阻塞其他操作 |
| 使用场景 |
普通查询、报表统计 |
库存检查、余额查询等需要强一致性的场景 |
| 具体例子 |
SELECT price FROM products WHERE id=1 |
SELECT stock FROM inventory WHERE product_id=1 FOR UPDATE |
4. 共享锁与排它锁对比
| 特性 |
共享锁(S锁) |
排它锁(X锁) |
| 兼容性 |
与其他S锁兼容 |
与所有锁都不兼容 |
| 加锁方式 |
SELECT...LOCK IN SHARE MODE |
SELECT...FOR UPDATE
INSERT/UPDATE/DELETE |
| 读数据 |
允许其他事务读 |
禁止其他事务读(当前读) |
| 写数据 |
禁止其他事务写 |
禁止其他事务写 |
| 使用场景 |
需要读取但不修改数据 |
需要修改或独占访问数据 |
5. 事务隔离级别详解
| 隔离级别 |
脏读 |
不可重复读 |
幻读 |
InnoDB解决方案</ |