-
四种隔离级别
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- mysql 里的默认隔离级别
- 串行化(Serializable)
-
有什么问题
- 脏写
- 两个事务并发写同一行记录,所有隔离级别下都不能允许发生这种情况
- 比如事务A和事务B对同一行进行写操作,在事务A更新数据且未提交时,事务B也更新了该行,就会造成脏写。
- 脏读
- 事务A读到事务B还未提交的写
- 不可重复读
- 事务中对同一行的多次读取的结果不同
- 事务A读了某行数据,事务B对该行进行了更新并提交,事务A再次读取该行后的结果与第一次读取的结果不同
- 幻读
- 对某个范围的多次读取不同
- 因为两次读中间,其他事务在该范围内插入了数据并提交
- 比如事务A读取了id为0~10的数据,此时事务B插入了id=5的数据,事务A再次读取id为0~10的数据时会发现多了一行
- 脏写
-
怎么解决
- MVCC
- 多版本并发控制,允许读写同时进行,性能较好
- 事务利用MVCC进行的读称为一致性读或快照读
- 加锁
- 读写不能同时进行,性能较差
- MVCC
-
四种隔离级别解决的问题
-
Read Uncommitted
- 什么都没有解决,脏读、不可重复读、缓读都存在
-
Read Committed
- 解决了脏读
- 通过ReadView实现,每次读都开启一个ReadView
-
Repeatable Read
- 通过ReadView实现,第一次读才开启一个ReadView
- SQL标准中只要求RR解决脏读和不可重复读,InnoDB中同时解决了脏读、不可重复读和幻读
-
Serializable
- 解决了脏读、不可重复读和幻读
- 由于所有请求只能排队操作,性能最差,通产在线上不会使用这种隔离级别
-