一、知识点
1. 事务(Transaction)
事务是数据库执行的一个操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单元。
事务的ACID特性:
特性 | 含义 | 说明 |
原子性(Atomicity) | 事务中所有操作要么全部成功提交,要么全部失败回滚 | 由日志和回滚机制保证 |
一致性(Consistency) | 事务执行前后,数据库从一个一致状态变到另一个一致状态 | 由应用程序和约束保证 |
隔离性(Isolation) | 多个事务并发执行时,彼此互不干扰 | 通过锁机制和隔离级别实现 |
持久性(Durability) | 事务一旦提交,其结果永久保存 | 通过日志和备份保证 |
2. 并发问题
多个事务同时操作同一数据时,会产生以下问题:
问题 | 描述 | 示例 |
丢失修改 | 两个事务读取同一数据并修改,后提交的覆盖先提交的结果 | T1读A=100,T2读A=100;T1写A=90,T2写A=80 → A=80(T1的更新丢失) |
脏读 | 一个事务读取了另一个未提交事务的数据 | T1修改A=90未提交;T2读取A=90;T1回滚 → T2读到脏数据 |
不可重复读 | 同一事务内两次读取同一数据,结果不同(因其他事务修改并提交) | T1第一次读A=100;T2修改A=90并提交;T1第二次读A=90 → 不一致 |
幻读 | 同一事务内两次查询,结果集不同(因其他事务插入或删除) | T1查询学生表有3条;T2插入1条并提交;T1再次查询得到4条 → 幻影行 |
3. 隔离级别
SQL标准定义了四种隔离级别,由低到高:
隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现方式 |
READ UNCOMMITTED(读未提交) | 可能 | 可能 | 可能 | 不加锁 |
READ COMMITTED(读已提交) | 不可能 | 可能 | 可能 | 写加锁,读不加锁(或快照读) |
REPEATABLE READ(可重复读) | 不可能 | 不可能 | 可能(MySQL InnoDB除外) | 读加共享锁,写加排他锁 |
SERIALIZABLE(串行化) | 不可能 | 不可能 | 不可能 | 强制事务串行执行 |
MySQL InnoDB 的 REPEATABLE READ 通过间隙锁解决了幻读问题。
4. 锁机制
共享锁(S锁):读锁,多个事务可同时持有,但不允许写。
排他锁(X锁):写锁,任何其他事务不能加任何锁。
意向锁:表级锁,表示事务准备在行上加锁,提高效率。
两段锁协议(2PL):事务分为加锁阶段(只加锁不放锁)和解锁阶段(只放锁不加锁),保证可串行化。