读提交隔离级别是如何实现的?

「读提交」隔离级别是在每个 select 都会生成一个新的 Read View,也意味着,事务期间的多次读取同一条数据,前后两次读的数据可能会出现不一致,因为可能这期间另外一个事务修改了该记录,并提交了事务。
那读提交隔离级别是怎么实现呢?我们还是以前面的例子来聊聊。
假设事务 A 和 事务 B 差不多同一时刻启动,然后事务 B 将小林的账户余额修改成了 200 万,但是事务 B 还未提交,这时事务 A 读到的数据,应该还是小林账户余额为 100 万的数据,那具体怎么做到的呢?
读已提交隔离级别是如何实现的? - 图1
事务 A 在找到小林这条记录时,会看这条记录的 trx_id,发现和事务 A 的 Read View 中的 creator_trx_id 要大,而且还在 m_ids 列表里,说明这条记录被事务 B 修改过,而且还可以知道事务 B 并没有提交事务,因为如果提交了事务,那么这条记录的 trx_id 就不会在 m_ids 列表里。因此,事务 A 不能读取该记录,而是沿着 undo log 链条往下找
当事务 B 修改数据并提交了事务后,这时事务 A 读到的数据,就是小林账户余额为 200 万的数据,那具体怎么做到的呢?
读已提交隔离级别是如何实现的? - 图2
事务 A 在找到小林这条记录时,会看这条记录的 trx_id,发现和事务 A 的 Read View 中的 creator_trx_id 要大,而且不在 m_ids 列表里,说明该记录的 trx_id 的事务是已经提交过的了,于是事务 A 就可以读取这条记录,这也就是所谓的读已提交机制。