事务
大约 2 分钟
隔离级别
名词解释
术语 | 定义 |
---|---|
脏读 | 脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了不一定最终存在的数据,这就是脏读。 |
可重复读 | 可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。主要保证数据更新的准确。 |
不可重复读 | 对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。不可重复读常在数据更新时出现。 |
幻读 | 假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。幻读常在数据插入时出现。 |
隔离级别 | 脏读 | 不可重复读 | 幻读 | 描述 |
---|---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ | 允许读取尚未提交的数据变更,意味着中间数据的变化也会被读取。未提交的数据还可能会回滚,导致读取到不存在的数据。 |
READ-COMMITTED | × | √ | √ | 允许读取并发事务已经提交的数据 |
REPEATABLE-READ | × | × | √ | 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改 |
SERIALIZABLE | × | × | × | 串行化,最高的隔离级别,所有事务按顺序执行互不干扰 |
注意
数据库的默认隔离级别是 REPEATABLE-READ
,这不能避免幻读
在 MySQL 中,主要通过 MVCC(多版本并发控制)来实现隔离级别,MVCC 是通过保存数据在某个时间点的快照来实现的,这样可以保证事务在执行过程中看到的数据是一致的。也可以通过使用 锁(Next-key lock) 来实现隔离级别, 但是锁会导致性能问题,所以 MySQL 选择了 MVCC。