Innodb读快照

概念

​ 什么是读快照

​ 简而言之在innodb中为了提高并发,每次读都是快照读,当然这个是只普通读,即select,不加锁的那种

为啥要用读快照

​ 为啥?

​ 当然是为了提高并发呀。如果采用读写锁,在数据库中为X锁和S锁

​ 但是这也写会阻塞读,这也并发量也不高

​ 聪明的先辈们提出了数据版本号的概念,MVVC多版本并发控制的思想,让每组数据都带有一个版本号,写数据时候克隆一份,操作克隆数据直至提交,读的时候读旧数据

读快照怎么实现

​ 采用回滚段实现,而回滚段又是采用undo日志

​ 说到undo那就必须说下redo,成对的来说

​ 我们知道一个事务为了保证正确提交已经应对各种问题,保证数据一致性,首先采用把要更新的数据做到redo日志里面,把原来数据做到undo日志里,直到commit根据日志写入表中

​ 数据库为每行元组都加上另外三个字段

  • DB_TRX_ID 记录最近一次修改它的事务id

  • DB_ROLL_PTR 指向回滚段undo日志的指针 指向旧数据

  • DB_ROW_ID 单调递增的id

    根据这个就能将原数据和新数据联系起来,实现MVVC的功能

普通读发送了啥

​ 假设数据A 版本是V0

​ 事务1进行更新 ,那么数据库会克隆一份出来当做V1,进行更新操作

​ 事务2会直接读取V0的数据

​ 事务1提交

​ 之后读取就是V1版本的数据,这是RC的模式下,但如果是RR模式的话,同一个事务内读取的会是第一次读取时候的值

consistent read (一致性读),InnoDB用多版本来提供查询数据库在某个时间点的快照。如果隔离级别是REPEATABLE READ,那么在同一个事务中的所有一致性读都读的是事务中第一个这样的读读到的快照;如果是READ COMMITTED,那么一个事务中的每一个一致性读都会读到它自己刷新的快照版本。Consistent read(一致性读)是READ COMMITTED和REPEATABLE READ隔离级别下普通SELECT语句默认的模式。一致性读不会给它所访问的表加任何形式的锁,因此其它事务可以同时并发的修改它们。

总结

​ 正因为有快照读才使得数据库Innodb存储引擎的并发能这么高