MySQL多版本并发控制机制(MVCC)源码浅析
由上面的lock_clust_rec_cons_read_sees可知,行版本可见性由read_view_sees_trx_id函数判定: 着实上述函数就是一个二分法,read_view着实生涯的是当前活泼事宜的全部事宜id,假如当前行版本对应修改的事宜id不在当前活泼事宜内里的话,就返回true,暗示当前版本可见,不然就是不行见,如下图所示。 接上述lock_clust_rec_cons_read_sees的返回: undolog搜刮可见版本的进程 我们此刻考查一下row_sel_build_prev_vers_for_mysql函数:
首要是挪用了row_ver_build_for_consistent_read要领返回可见版本: 整个进程如下图所示: 至于undolog怎么规复出对应版本的row记录就又是一个伟大的进程了,因为篇幅缘故起因,在此略过不表。 read_view建设机缘再接头 在建设同等性视图的row_search_for_mysql的代码中 trx_assign_read_view中由这么一段代码 以是综合这两段代码,即在一个事宜中,只有第一次运行select(不加锁)的时辰才会建设同等性视图,如下图所示: 笔者结构了此种场景模仿过,确实云云。 MVCC和锁的同时浸染导致的一些征象 MySQL是通过MVCC和二阶段锁(2PL)来分身机能和同等性的,可是因为MySQL仅仅在select时辰才建设同等性视图,而在update等加锁操纵的时辰并不做云云操纵,以是就会发生一些诡异的征象。如下图所示: 假如领略了update不走同等性视图(read_view),而select走同等性视图(read_view),就可以很好表明这个征象。 如下图所示: 总结 MySQL为了分身机能和ACID行使了大量伟大的机制,2PL(两阶段锁)和MVCC就是着实现的典范。幸好可以通过xcode等IDE举办利便的debug,这样就可以很是准确加便捷的追踪其各类机制的实现。但愿这篇文章可以或许辅佐到喜好研究MySQL源码的读者们。 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |