MYSQL事务隔离级别的实现原理


MYSQL事务隔离级别的实现原理

1、未提交读:直接读写,没什么控制
2、已提交读:一致性视图。每次select都去重新计算一次一致性视图。
3、可重复读:一致性视图。以后每次select都用第一次计算的一致性视图。
4、串行化:读就用读锁,写就用写锁

蓝色是已提交事务id,红色是未提交事务id,事务id是递增的,会分为两个队列,已提交事务队列和未提交事务队列

已提交读的实现

当事务A trx_id=6执行select 语句,发现x=2这个版本数据的事务trx_id是5,然后拿trx_id=5去已提交事务队列查,发现trx_id=5这是事务还没提交,然后通过undo log回滚到数据的上一个版本,上一个版本是x=1及其trx_id=7,发现trx_id=7这是事务也没提交,然后通过undo log再回滚到数据的上一个版本,上一个版本是x=0及其trx_id=4,拿trx_id=4去已提交事务队列查,发现trx_id=4这是事务已经提交了,而且小于等于事务A的 trx_id=6(4小于6),所以trx_id=4这是事务对于事务A是可见的最终事务A 执行select 语句查询到x=0,这就是已提交读的实现

已提交读和可重复读区别

已提交读在第二次select的时候又走一遍上面计算一致性视图的流程,如果其他事务有提交的话,可能到不是x=0的结果了。

而可重复读,第二次select还是使用第一次select的结果x=0,不管其他事务提不提交。以后的每次select都直接使用第一次select的结果,不再运算第二次,所以每次select的结果都是一样。

所以已提交读和可重复读的区别就是都用一致性视图,但前者每次select都去算出最新的,后者每次select都用第一次的结果

image.png

你可能感兴趣的:(MYSQL事务隔离级别的实现原理)