MySQL事务隔离级别和MVCC

MySQL事务隔离级别和MVCC 参考:https://mp.weixin.qq.com/s/Jeg8656gGtkPteYWrG5_Nw

  • 1.MVCC只对读已提交和可重复的读有效果,而未提交读和串行则无意义。
  • 2.每条记录都会有trx_id(事务修改记录的id)和roll_pointer是一个指针指向旧版本的undo日志链表(row_id不是必必要的,如果有主键存在就不需要了)
  • 3.版本链的头结点就是记录的最新的值。
  • 4.ReadVie--包含当前系统中还有哪些活跃的读写事务,把它们的事务id放入到一个列表中,列表命名为m_ids。同时还有min_trx_id和max_trx_id
  • 5.min_trx_id:该值代表生成readview时m_ids中的最小值。
  • 6.max_trx_id:该值代表生成readview时系统中应该分配给下一个事务的id值。
  • 7.注意max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的记录提交了。那么一个新的读事务在生成readview时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。
  • 8.所以判断可见性的步骤就是:
  • 9.如果记录的trx_id列小于min_trx_id,说明肯定可见。
  • 10.如果记录的trx_id列大于max_trx_id,说明肯定不可见。
  • 11.如果记录的trx_id列在min_trx_id和max_trx_id之间,就要看一下该trx_id在不在m_ids列表中,如果在,说明不可见,否则可见。
  • 12.如果trx_id在m_ids列表中则说明事务还未提交则该记录无法被提交。
  • 13.如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本,如果最后一个版本也不可见的话,那么就意味着该条记录对该事务不可见,查询结果就不包含该记录。
  • 14.读已提交则是每次查询的时候都会生成一个新的readView。
  • 15.可重复读则是第一次查询生成readView。

你可能感兴趣的:(MySQL事务隔离级别和MVCC)