事务相关部分重点
事务的ACID特性
原子性
Atomicity:事务是最小执行单位,像原子一样不可拆分,要么全部成功,要么全部失败
一致性
Consistency:执行事务前后的数据保持一致。比如转账业务无论成败总额不变
隔离性
Isolation:并发执行的事务不会相互影响,它们对数据库的影响和它们串行执行的效果是一样的
持久性
Durability:当事务被提交后,它对数据库中数据的改变是持久的。系统故障等不会导致数据丢失
数据库常见的并发异常
脏写
事务2已提交,事务1回滚,导致事务2提交的修改也被回滚
事务1 | 事务2 |
---|---|
read(A) = 10 | |
read(A) = 10 | |
write(A) = 30 | |
commit | |
write(A) = 20 | |
rollback(A = 10) |
丢失更新
事务2已提交,事务1在之后提交,导致事务1提交的修改覆盖了事务2的修改
事务1 | 事务2 |
---|---|
read(A) = 10 | |
read(A) = 10 | |
A = A + 10 | |
commit | |
A = A - 10 | |
commit(A = 0) |
脏读
事务2读取到事务1还未提交的脏数据
事务1 | 事务2 |
---|---|
read(A) = 10 | |
write(A) = 20 | |
read(A) = 20 | |
rollback(A = 10) |
不可重复读
事务1开启后,由于事务2提交了更新,导致事务1两次读取的结果不一致
事务1 | 事务2 |
---|---|
read(A) = 10 | |
read(A) = 10 | |
write(A) = 20 | |
commit | |
read(A) = 20 |
幻读
事务1开启后,由于事务2提交了更新,导致事务1两次读取同一范围的结果不一致
事务1 | 事务2 |
---|---|
read(A < 5) = (1, 2, 3) | |
write(A) = 4 | |
commit | |
read(A < 5) = (1, 2, 3, 4) |
幻读和不可重复读的区别在于,幻读针对不确定的多行数据,所以幻读通常出现在带有查询条件的范围查询中。
事务的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 脏写 | 丢失更新 |
---|---|---|---|---|---|
READ-UNCOMMITTED | 可能 | 可能 | 可能 | 可能 | |
READ-COMMITTED | 可能 | 可能 | 可能 | ||
REPEATABLE-READ | 可能 | ||||
SERIALIZABLE |
MySQL InnoDB 存储引擎默认隔离级别是REPEATABLE-READ