目录
定义(参考: https://developer.aliyun.com/article/746718):
3 - Repeatable Read (可重复读)【MySQL的默认隔离级别】
事务的四个特征(ACID)
- Atomicity 原子性
- Consistency 一致性
- Isolation 隔离性
- Durablitiy 持久性
隔离性:
四种隔离级别:
- Read Uncommitted ( 读未提交, 即 读到了未提交的数据)
- Read Committed (读提交, 即 读到了提交的数据)
- Repeatable Read(可重复读)【MySQL的默认隔离级别】
- Serializable (串行化)
定义(参考: https://developer.aliyun.com/article/746718):
1 - Read Uncommitted:
读未提交, 即 所有事务都可以读到其他未提交事务的执行结果。
会引发脏读的问题, 读到了其他事务未提交的数据。
2 - Read Committed(读提交)
即只能读到已提交的数据。 即 一个事务能可以立即看见已经提交事务所做的改变, 不会看见未提交事务所做的改变。
这种隔离级别可以解决 “脏读”的问题,即防止读到其他事务未提交的数据;但是会引发 “不可重复读”的问题, 因为不可重复读指 一个事务中, 不同时刻,读到的数据可能不一样。
当隔离级别为 Read Committed时,一个事务中可以读到其他事务提交的结果, 其他事务提交前后, 本事务读到的数据不一致;
3 - Repeatable Read (可重复读)【MySQL的默认隔离级别】
可重复读是指, 一个事务内, 多次查询结果都是一致的,确保同一事务的多个实例(数据行)在并发读取时,会得到相同的结果。
本事务开启后,不会读到其他事务提交或修改的更新。
比如
如果是 Read Committed, 则事务A读到的结果是101, 而如果是 Repeatable Read, 则读到的是100, 因为事务A开始后,第一次读数据时读到的是100, 此时事务B还未提交, 即使事务B提交后, 事务A读到的扔是100。
这种隔离级别可以解决“不可重复读”, 但会引发“幻读” 的问题, 即 在这种隔离级别下,因为无法读到其他事务的操作,所以当事务B插入了新数据时,事务A是无法读到的, 当插入数据时,如果有唯一性主键约束,就会导致插入失败,如果没有约束,可能会导致产生两条数据。
4 - 串行化(Serializable)
最高的隔离级别。 这种隔离级别,强制事务排序,使之不会发生冲突,从而解决幻读的问题。但会引发性能问题。事务排序会导致性能下降。
隔离性要解决的问题:
脏读
是指 读到了 其他事务未提交的数据。 未提交意味着数据这些数据可能会回滚,最终会有可能不存在数据库。
可重复读
可重复读是指,一个事务内, “最开始读到的数据”和 “事务结束前的任意时刻读到的同一批数据” 都是一致的。通常针对数据 更新(update)操作
不可重复读
对比可重复读, 不可重复读指的是 ,一个事务内,不同时刻读到的同一批数据可能不一样, 可能会受到其他事务的影响, 比如其他事务修改了这批数据并提交, 则前后读到的数据就是不一致的。通常也是针对 更新(update)操作;
幻读
幻读是针对 插入(INSERT)操作来说的。
一个事务读到了另一个事务提交的数据;