Mysql的MVCC机制与Undo Log日志

MVCC,全称是Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问

目录

一、读的几种情况

  • 1、当前读
  • 2、快照读

二、MVCC

  • 1、MVCC解决的问题
  • 2、Undo Log 机制

一、读的几种情况

返回顶部目录

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

1、当前读

select lock in share mode(共享锁)、select for update 、 update、insert 、delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

2、快照读

不加锁的select操作就是快照读,即不加锁的非阻塞读,提高数据库的并发查询能力;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

返回顶部目录


二、MVCC

返回顶部目录

1、MVCC解决的问题

数据库并发场景有三种,分别为:

​   1、读读:不存在任何问题,也不需要并发控制

​   2、读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读

​   3、写写:有线程安全问题,可能存在更新丢失问题

MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决以下问题:

1、在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
2、解决脏读、幻读、不可重复读等事务隔离问题,但是不能解决更新丢失问题

2、Undo Log 机制

Undo log的字面意思是撤销操作的日志,指的是使mysql中的数据回到某个状态。在事务开启中(Undo Log是InnerDB独有的),mysql会将待修改的记录保存到Undo Log中。如果数据库崩溃或者事务需要回滚时,mysql可以通过利用Undo log日志,将数据库中的事务回滚到之前的状态。mysql新增、修改、删除数据时,在事务开启前,就会将信息写入Undo Log中,事务提交时,并不会立刻删除Undo Log,InnoDB存储引擎会将事务对应的Undo Log放入待删除列表中,之后会通过后台的purge thread对待删除的列表进行删除操作处理。

注意的是Undo log是一种逻辑日志,记录的是一种逻辑过程。比如mysql执行delete操作,Undo log就会记录一个insert操作;mysql执行一个insert操作,Undo Log就会记录一个delete操作;mysqlk执行update操作,Undo Log记录一个相反的update操作。

Undo Log以段的方式来管理记录日志信息,在InnoDB存储引擎的数据文件中,包含了一种rollback segment的回滚段,内部包含了1024个undo log segment 。

Undo Log实现了事务的原子性多版本并发控制(MVCC)。原子性——Mysql出现了错误、或者手动执行了事务的回滚,Undo Log会将数据库中的数据恢复到之前的状态。下图是Undo log实现多版本并发控制,事务A未提交之前,undo log保存了未提交之前的版本,事务B读取的是之前的版本信息。
在这里插入图片描述
返回顶部目录

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