mysql 读写 冲突_mysql处理读写冲突的MVCC

目录

一 概念

二 MVCC解决了什么问题

三 实现原理

数据行隐藏列

Undo Log 链

ReadView

参考文章:

一 概念

为了解决多事务并发问题,早期数据库不论读取还是写入,都用锁来实现,但是锁会带来性能的问题。人们尝试各种优化方案,写入和读取的优化方式不同。对于数据库写入操作,没有特别好的办法,因为无论如何要避免并发修改一个数据,就得靠锁。不同的数据库对于写入操作都会加悲观锁(比如MySQL是X锁)。为了避免X锁带来的性能问题,人们在合适的场合会选择用乐观锁来优化。有的数据库内建乐观锁,但是有的没有(比如MySQL就没有),所以需要开发人员自己在数据表里加version列,自己写业务代码实现。

顺便提一句,乐观锁并不一定总是比悲观锁性能表现更好,这要看竞争的程度。如果数据访问竞争的非常厉害,乐观锁只会让CPU和IO白白浪费而已。

MVCC(Multi-Version Concurrency Control)多版本并发控制。

MySQL的大多数事务型(如InnoDB,Falcon等)存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,他们一般都同时实现了MVCC。当前不仅仅是MySQL,其它数据库系统(如Oracle,PostgreSQL)也都实现了MVCC。值得注意的是MVCC并没有一个统一的实现标准,所以不同的数据库,不同的存储引擎的实现都不尽相同。

MVCC的意思用简单的话讲就是对数据库的任何修改的提交都不会直接覆盖之前的数据,而是产生一个新的版本与老版本共存,使得读取时可以完全不加锁

二 MVCC解决了什么问题

请牢记这句话

你可能感兴趣的:(mysql,读写,冲突)