正确理解MySql的MVCC实现原理

什么是MVCC?

MVCC:多版本并发控制,是一种并发控制的方法,一般是数据库管理系统中,实现数据的并发访问,mysql中的事务可以通过这种方式实现。

MVCCMySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

MVCC定义的当前读、快照读

  • MVCC 多版本并发控制是  ,维持一个数据的多个版本,使得读写操作没有冲突

  • 因为 MVCC 只是一个抽象概念,要实现这么一个概念,MySQL 就需要提供具体的功能去实现它,「快照读就是 MySQL 实现 MVCC 理想模型的其中一个非阻塞读功能」。而相对而言,当前读就是悲观锁的具体功能实现
  • 再深入研究。MVCC 模型在 MySQL 中的具体实现则是由 3 个隐式字段undo 日志 ,Read View 等去完成的

MVCC可以解決的场景

MVCC可以解决读-写冲突的无锁并发控制,可以通过快照读来实现读-写冲突。

MVCC的实现原理

MVCC 的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段undo日志 ,Read View 来实现的。所以我们先来看看这个三个 point 的概念

隐藏字段:

每行记录除了我们自定义的字段外,还有数据库隐式定的 DB_TRX_IDDB_ROLL_PTRDB_ROW_ID 等字段

  • DB_TRX_ID

        6 byte,最近修改(修改/插入)事务 ID:记录创建这条记录/最后一次修改该记录的事务 ID

  • DB_ROLL_PTR

        7 byte,回滚指针,指向这条记录的上一个版本(存储于 rollback segment 里)

  • DB_ROW_ID

        6 byte,隐含的自增 ID(隐藏主键),如果数据表没有主键,InnoDB 会自动以DB_ROW_ID产生一个聚簇索引

undo日志

  • insert undo log

        代表事务在 insert 新记录时产生的 undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃

  • update undo log

        事务在进行 update 或 delete 时产生的 undo log ; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被 purge 线程统一清除

你可能感兴趣的:(MySQL数据库,数据库)