MVCC用更加灵活的方式处理并发,实现了读不加锁,读写不冲突。保证了事务的隔离性(可重复读),避免了不可重复读问题。
数据库实现MVCC的方式不尽相同,典型的有乐观并发控制,悲观并发控制
Mvcc类似行级锁,大都实现了非阻塞的读操作,写操作只锁定必要的行。
Mvcc通过保存数据在某个时间点的快照来实现。即不管需要执行多长时间,每个事务看到的数据是一致的
innnoDB需要维护mvcc,会损耗性能,这也是innoBD比Myisam查询慢的原因之一。
每行记录保存两个隐藏的列,分别为创建时间和过期时间(或删除时间)的版本号。开始版本号作为事务版本号,每开始一个新的事务,版本号会自增
innoDB可重复读隔离级别下的具体操作
查询需要满足以下条件:
插入的行的行版本号为当前系统版本号
删除的行的删除版本号为当前系统版本号
转换成insert + delete:插入一条数据,行版本号设为当前系统版本号;原来行的删除版本号为当前系统版本号
Mvcc只在可重复读和提交读的隔离级别下生效,因为为提交读总是读取最新数据行,可串行化对所有读取的行加锁。