Mysql InnoDB对于MVCC的实现摘要

InnoDB的每一个读写操作都是事务,但是应对高吞吐量,比较多的读多写少场景,单单行锁是非常单薄的,所以其实现了MVCC,效果不错。下面简单tips下InnoDB的MVCC对于SELECT,INSERT,DELETE,UPDATE的相应行为。

SELECT
     InnoDB必须检查涉及查询的行满足下面两个条件:
     1.InnoDB必须找到一个版本小于或者等于本次事务版本的行数据。这保证了这行数据存在于
       本次事务开始,创建或者修改这行之前。
     2.这行数据的删除版本必须是为空的或者大于本次事务版本。这保证了在本次事务开始之前
       该行数据是没有被删除的。
     查询返回的行可能会带会这些测试一起做为结果。
INSERT
     InnoDB 在新行上记录当前系统产生的版本。
DELETE
     InnoDB 把当前系统产生的版本做为被删除行的删除ID
UPDATE
     InnoDB copy出这一行,并且使用当前系统产生的版本给这一新行,同时把这个版本号做为
     被copy那一行的删除ID.

InnoDB实现的MVCC用意很明显,写不阻塞读(写写冲突等待貌似没有说明)。再者,有统一的递增版本号产生对MVCC的实现也是非常关键的,这也是分布式场景下如果要实现MVCC比较困难的地方。不过无论是分布式事务还是单机事务,都要面临失败后recover(事务日志),死锁(死锁检测)等问题,单机下己经解决的不错了,分布式情况下还需要进一步实践。

猜你喜欢

转载自bucketli.iteye.com/blog/1314051
今日推荐