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都用第一次的结果。