问题: 有开发问到,为啥我在一个事务中删除数据没有报错,还能select查到呢? 其实这是隔离级别的原因,不同隔离级别带来的表现是不同的,下面主要给大家介绍下RC和RR隔离级别的一些原理
本文主要介绍RR和RC在事务中如何访问数据的,导语中的这个问题我们在最后会说明原因
首先大家需要先了解一个视图的概念,这个视图并不是指view这种虚拟表,而是指innodb在实现MVCC时用到的一致性读视图,即consistent read view,用于实现RC和RR隔离级别的实现
RR和RC隔离级别下什么时候会产生这个视图呢?
- RR:事务启动时创建的
- 这里需要注意,如果是用begin或者start transaction的方式启动事务的话,需要在执行第一个操作innodb表的语句才会创建这个视图
- start transaction with consistent snapshot会直接创建这个一致性视图
- RC:每个SQL语句开始执行的时候创建的
MVCC中不同隔离级别如何访问数据的
RR和RC隔离级别的区别,先说结论:
- RR:
1、针对查询:快照读,以建立的一致性视图为主,只能查看在一致性快照前就已经提交完成的数据
2、针对变更:先进行当前读在进行变更,每次变更的都是最新的数据 - RC:
1、所有都是当前读:只能查看在语句启动前就已经提交完成的数据
怎么判断具体哪些数据是可以访问的呢?这里我们需要了解一下在事务中访问数据时都做了什么操作
- innodb 里