Mybatis 之MVCC (Multi-Version Concurrency Control)

1. mvcc一句话介绍:mvcc, 多版本并发控制。只在可重复读(RR)和读已提交(RC)两种事务隔离机制下才有效。是数据库引擎(InnoDB)层面实现的,用来处理写冲突,提高性能访问。

2. 为什么要用mvcc,是用来解决什么问题:

a. 原子性(Automic):有个undo log的回滚链。 undolog 日志保存了RowID(当前处理哪一条数据)、事务ID、回滚指针(上一条记录的位置)。如果当前事务执行失败,就会通过undolog 回滚。

b. 隔离性(Isolation):

  • repeatable read(可重复读)场景:在mvcc的记录中,有一个ReadView 。在事务第一次进入,会生成一个快照。当自己事务内部更新时候,ReadView也会更新。在查询时候,会根据事务id判断应该读取的那个ReadView的数据。

         m_ids:ReadView 中有几个重要的参数:a. 生成当前ReadView 时候的活跃事务id;

         min_trx_id:当前系统中活跃的读写事务中最小的事务id;

         max_trx_id:当前系统中活跃的读写事务中最大的事务id;

        creator_trx_id:表示生成该readview的事务的事务id;

        原则:就是我查之前你改了,那我就查不到,我自己改的,我能看到。

  • Read-submitted(读已提交) 场景:这个与上面可重复读的区别在与,每次查询都会生成新的 ReadView。 
  • 对幻读的控制:在快照读时候,可以解决幻读问题。但是在当前读场景,无法解决。当前读主要靠间歇锁去控制了。

 c. 性能提升:

  • 在没有mvcc 多版本控制时候,如果 数据正在被写锁控制,无法读取。现在通过把数据库的行锁与行的多个版本结合起来,实现并发控制。

 d. 可靠性保障:

      redolog 对数据的恢复。

4. 思考:

MVCC 思想在我们的代码中可以借鉴的思想:

a. 多版本思想。

b. 为了性能,减少IO,有一种思路就是,先写log,轻量级保存。然后放缓存,等缓存有了一批再去IO写数据操作。(redolog这样干的)

c. 如何保障复杂的一致性。MVCC这边存在几个一致性:undolog,redolog,binlog。

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